2、结构体定义、类的最后括号后面加上分号。
3、共有成员(public):既可以被类内部的其他成员访问,也能被类以外的成员访问
4、私有成员(private):只能被类内部的其他成员访问,而不能被其他内容访问。
5、保护成员(public):可以由本类的成员访问,也可以由本类的派生类的成员函数
访问。
6、构造函数创建类对象,初始化其成员析构函数撤销类对象。析构函数和构造函数是
类的特殊成员函数。
7、构造函数的特点:
1)、构造函数的名称必须与类名相同。
2)、构造函数可以有任意类型的参数,但是它不能具有返回类型,甚至void也不行。
3)、构造函数被声明为公有函数,但不能像其他成员函数被显示地调用,它是在声明类的对象的同时被系统自动调用的。
8、析构函数的特点:
1)、析构函数和构造函数的名字相同,但它前面必须加上“~”。
2)、析构函数不具有返回类型,同时不能有参数,也不能重载一个类只能拥有一个析构函数。
3)、析构函数不能显示调用,它在类生命周期结束时被系统自动调用。
9、C++规定每个类必须有析构函数。若没有提供任何析构函数,那么C++自动提供一个默认的析构函数,该默认析构函数是一个没有具体操作的函数。
10、拷贝构造函数的特点:
1)、拷贝构造函数属于构造函数的一种,其函数名必须与类名相同,并且该函数没有返回类型。
2)、拷贝函数有且只有一个参数,并且是同类型对象的一个引用。
3)、每个类都应该具有一个拷贝构造函数,系统会生成一个默认的拷贝构造函数。
11、构造函数与析构函数的调用顺序:
①一般情况下,析构函数与构造函数顺序相反。
②全局范围内定义的对象的构造函数,在文件中的任何其他任何函数(包括main)执行之前调用。当main函数终止或者调用exit函数时调用相应的析构函数。
③当程序执行到对象定义时,调用自动局部对象的构造函数。该对象的析构函数在对象离开范围时调用。自动对象的构造函数和析构函数在每次对象进入和离开范围时调用。
④static局部对象的构造函数只在程序执行首次到达对象定义时调用一次,对象的析构函数在main终止或调用exit函数时调用。
⑤可见构造函数的调用顺序是:全局对象→局部自动(或静态)对象(按执行顺序)
⑥析构函数的调用顺序:调用自动对象→main执行结束后,静态对象(局部或全局)→全局函数
12、如果需要为一个类定义多个对象,可以把这些对象通过一个数组来存放,这个数组称为对象数组。对象数组的元素是对象,拥有其各自的成员变量和成员函数。
13、使用指针时首先把它指向一个已经创建的对象。在一般情况下,用“.”来引用对象成员,当用指向对象的指针来引用对象成员时用“->”。
14、this指针是一个const指针,不能在程序中修改它或给它赋值。This指针是一个局部函数,它的作用域仅在一个对象内部。
15、静态成员在类的定义之外被初始化,初始化类的静态成员时不能加static符。
16、静态成员函数不能访问非静态的数据成员,它只能访问静态数据成员,也只能够调用其它的静态成员函数。因为在调用一般成员函数时,当前对象的地址(this指针)是作为隐含的参数传递到被调用函数的。但一个静态成员函数没有this,所以无法访问非静态数据成员,也无法调用一般的成员函数。
17、静态成员函数的特点:
①静态成员函数可以定成内联的,也可以在类外定义,在类外定义时不要使用static修饰
②因为静态成员函数没有this指针,因此静态成员函数只能访问全局变量或一个类中的静态数据成员。当它使用静态数据成员时,可以对一个类中对象之间的共享数据进行维护。
③静态数据成员和一般成员一样,同样遵循public、private、protected访问规则。
④静态数据成员的作用域是类,而不是类的对象。因此静态数据成员在对象创建前已经存在。
⑤在访问类的public域的静态数据成员函数或静态成员函数时,可以通过一下形式进行访问:·对象名.静态成员 ·对象指针->静态成员 ·类名::静态成员
⑥静态数据成员不能再类中进行初始化,必须在类的外部初始化,一般在定义类的而文件中进行初始化。
18、只有定义了对象之后,系统才为对象并且只为对象分配存储空间。
19、友元能够使得普通函数直接访问类的私有数据,避免了类成员函数的频繁调用。类的友元函数不是类的成员函数,它在类的范围之外定义,但可以访问该类的所有成员函数,包括私有成员。用关键字friend。友元函数的定义可以在类的内部,也可以在类的外部。友元函数虽然可以访问类的私有成员,但它不是类的成员函数,也不能直接引用当前类的成员。
20、一个类的成员函数也可以声明为另一个类的友元,该函数作为成员函数不仅可以访问自己所在类的所有成员,还可以作为友元函数访问另一个类的所有成员。不仅可以把一个函数声明成一个类的友元,一个类也可以声明为另一个类的友元。友元类中的所有成员函数可以访问另一个类的私有成员。友元关系是单向的,不具有交换性,友元关系不具有传递性。
21、继承分为单继承和多继承2种方式,对于单继承,派生类只有一个基类;对于多继承,派生类通常是从多个基类派生出来的。
22、单继承格式:class 派生类名:继承方式 基类名
多继承格式:class 派生类名:继承方式1 基类名1,……,继承方式n 基类名n
23、C++中规定了三种继承方式:public、protected、private
派生类成员访问属性
基类成员访问属性 | 继承方式 | ||
public | protected | private | |
public | public | protected | private |
protected | protected | protected | private |
private | 在派生类中隐藏 | 在派生类中隐藏 | 在派生类中隐藏 |
⑴无论何种派生方式,基类的私有成员都不能成为派生类继承的成员,基类的保护成员和公有成员可以继承为派生类的成员。
⑵私有派生类使基类的保护成员和公有成员都成为派生类的私有成员。
⑶保护派生类使基类的保护成员和公有成员都成为派生类的保护成员。
⑷公有派生类使基类的保护成员和公有成员在派生类中仍然保护成员和公有成员。
25、因为派生类继承了基类的成员,所以在实例化派生类对象时,必须调用基类的构造函数来初始化派生来对象中基类的成员。派生类既可以隐式调用也可以显示调用基类的构造函数。在实例化派生类对象时,派生类的构造函数总是先调用其基类的构造函数来初始化派生类中的基类成员。而派生的析构函数在基类的析构函数之前调用。
26、派生类不能继承基类的构造函数和析构函数。C++中,可以和使用成员初始化列表的方式来构造派生类的构造函数:
单继承方式:派生类名::派生类构造函数名(参数表):基类构造函数名(参数表)
多继承方式:派生类名::派生类构造函数名(参数表):基类构造函数名(参数表),…
27、使用作用域运算符(::)来消除因为多重继承机制带来的歧义性。
28、在C++中,如果要使公共基类只产生一个拷贝,则应当把这个基类声明为虚函数,使用关键字virtual.其语法形式:
class 派生类名:virtual 继承方式 基类名
29、虚拟机制使用注意:
⑴如果在虚基类中定义了带参数的构造函数,并且没有定义默认的构造函数,在整个继承结构中,所有的直接或间接派生类中都必须在构造函数中使用成员初始化列表的方式调用虚基类的构造函数,初始化虚基类中的成员。
⑵如果在同一个继承层次中同时包含虚基类和非虚基类,C++编译器先调用虚基类的构造函数,再调用非虚基类的构造函数。
⑶如果虚基类是由非虚基类派生而来的,同样遵守先调用基类构造函数再调用派生类构造函数的规则、
30、多继承构造函数和析构函数的执行顺序:
⑴任何虚拟继承基类的构造函数按照它们被继承的顺序构造;
⑵任何非虚拟继承基类的构造函数按照它们被继承的顺序构造;
⑶任何成员对象按照它们声明的顺序调用;
⑷派生类自己的构造函数。
31、运算符重载的函数名是由关键字operator和要重载的运算符组成。其形式:
返回类型 operator 运算符号 (参数列表)
32、函数模板的声明格式:
Template 返回类型 函数名 (模板形参表) 返回类型 函数名 (模板形参表) { { 函数体 函数体 } } 函数模板的参数类型必须保持一致。 33、使用一个非模板函数来重载函数模板,该非模板函数只有函数原型的声明而没有函数体,在这种情况下,当系统执行此函数时会自动调用它重载的函数模板的函数体。 34、类模板的格式: template class 类名{ class 类名{ 函数体 函数体 } } 35、类模板不代表一个具体的、实际的类,而类模板的使用就是将类模板实例化成一个具体的类,格式为:类名<实际的类型>对象名;在每个类模板定义之前,都需要在前面加上模板声明template 36、标准流对象: 使用类ifstream打开摸个读文件格式如下: Ifstream <对象名>;对象名.open(“<文件名>”); 或者Ifstream <对象名>(“<文件名>”); 使用ofstream打开某个写文件的格式: ofstream <对象名>;对象名.open(“<文件名>”); 或者ofstream <对象名>(“<文件名>”); 使用fstream打开一个文件的格式: fstream(对象名);(对象名).open(“<文件名>”,<打开方式>); 打开文件操作的方式常量: <刘对象名>.close(); test4、6、17、18、20、22、23、25、28、31有误
37、C++名字 C名字 设备 默认含义 cin Stdin 键盘 标准输入 Cout Stdout 屏幕 标准输出 Cerr Stderr 屏幕 标准错误输出 Clog stdprn 打印机 打印机输出
38、文件打开操作:控制符名称 作用 控制符名称 作用 endl 换行符并刷新流 Ws 输入时略去空白字符 ends 输出时在字符串后插入NULL作为未符 Dec 令I/O数据按八进制格式 flush 刷新,把流从缓冲区输出到目标设备 Hex 令I/O数据按八进制格式 oct 令I/O数据按八进制格式
39、关闭文件:方式常量 含义 ios::aet 文件打开时,文件指针位于文件尾 ios::in 以输入(读)方式打开文件,(ifstream)默认 ios::out 以输出(写)方式打开文件,(ofstream)默认 ios::app 以输出追加方式打开文件 ios::trunc 如果文件存在,清除文件内容(默认),不存在则创建 ios::nocreat 打开一个已有文件,如果文件不存在,返回错误信息 ios::noreplace 如果文件存在,除非设置ios::aet 或ios::app,否则打开操作失败 ios::out | ios::binary 以二进制写方式打开文件 ios::in | ios::binary 以二进制读方式打开文件