1、inline函数的定义要和声明在同一个文件中,不管它是在类内定义还是在类外定义。
2、带默认参数的成员函数,默认参数的值若在函数声明时指定了,则在函数定义时不要指定,否则编译报错:重定义默认参数。
3、关于const:
1)类的常数据成员的初始化只能通过构造函数的参数初始化表完成,不能在构造函数体中赋值;
2)const对象的所有数据成员都是const的,但成员函数不一定;const对象只能调用const成员函数,不能调用非const成员函数;
3)const成员函数不能调用非const成员函数;
4)以 [类名 *const 指针变量名=对象地址] 的方式定义指向对象的常指针,则这个指针变量不能再指向别的对象,但可以改变指针指向对象的数据成员的值;
5)以 [const 类名 *指针变量名=对象地址] 的方式定义指向常对象的指针,则这个指针变量不能改变指向对象的数据成员的值,但可以使这个指针变量指向别的对象。
4、对象之间用=进行赋值时,类的数据成员中不能有动态分配的数据,否则在赋值时可能出现严重后果。
5、静态数据成员用于类的不同对象间共享,其初始化只能在类外进行,不能以参数初始化表的方式初始化,若不初始化,则默认值为0。
6、静态成员函数没有this指针,不能直接通过变量名访问非静态数据成员,如果要引用非静态成员函数,则应以[对象名.变量名]的方式进行。
7、如果要把运算符重载函数定义为类的成员函数,则该运算符的第一个参数必须是本类的对象。通常把单目运算符重载为类的成员函数,把双目运算符重载为类的友元函数。
8、构造函数的调用顺序:基类构造函数-->子对象构造函数-->本类构造函数。析构函数的调用顺序与此相反。
9、虚基类:为了保证在多重继承时,只保留一份间接基类的成员。比如B、C都继承自A,D多重继承自B和C,如果继承时使A为虚基类,则D中只会保留一份A中的成员。
虚基类的声明是在派生类头部声明,形式为 class 派生类名:virtual 继承方式 基类名。前述例子中,B和C类声明时都要把A声明为虚基类,否则D中还会有多份A的成员。
间接派生类也要负责虚基类的初始化,前述例子中,C的构造函数首部也要调用A的构造函数。
10、多态性分为静态多态性和动态多态性。
静态多态性通过函数重载实现,在程序编译时系统就能决定调用的是哪个函数,因此也叫编译时的多态性。即静态关联,早期关联。
动态多态性通过虚函数实现,在程序运行过程中才能动态地确定要调用的函数,因此也叫运行时的多态性。即动态关联,滞后关联。
如果一个类有虚函数,则编译系统会为该类构造一个虚函数表,它是一个指针数组,存放每个虚函数的入口地址。
11、虚析构函数的作用是保证在delete一个指向派生类的基类指针时,派生类的析构函数也能被调用。
当基类的析构函数为虚函数时,无论指针指向本类族中的哪个类对象,系统会采用动态关联,调用该对象的析构函数。
当基类的析构函数为虚函数时,所有派生类的析构函数自动成为虚函数。最好把基类的析构函数声明为虚函数。
构造函数不能是虚函数。因为在执行构造函数时,类对象还没有完全建立,无法进行关联。
12、C++的流对象包括标准输入输出流、文件流、字符串流。对应的流类包括istream、ostream、iostream、ifstream、ofstream、fstream、istrstream、ostrstream、strstream等。对应的头文件分别是iostream、fstream、strstream。没有ifstream、ofstream、istrstream、ostrstream等头文件。
13、cout、cin不是C++语句,也不是关键字,它们分别是ostream类和istream类的对象,在头文件iostream中定义。
scanf、printf不是C语言的语句,也不是关键字,它们是C定义的函数。
14、标准输出流包括cout、cerr、clog。cout默认是输出到屏幕,也可以重定向输出到磁盘文件。cerr是标准出错流,只能输出到显示器。clog也是标准出错流,它与cerr只有一个微小区别:cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息是放到缓冲区的,当缓冲区满后或遇到endl时向显示器输出(类似于cout)。
15、对ASCII文件的操作可以用<<和>>两个流运算符,也可以用put、get、getline等成员函数。
对ASCII文件的打开方式要么是ios::in,要么是ios::out,不能是ios::in | ios::out。(区别于二进制文件)
对二进制文件的操作用成员函数read、write进行,还可用gcout、tellg、seekg、tellp、seekp等函数获取或者变换文件指针位置。
二进制文件的打开方式可以是ios::in | ios::out | ios::binary,此时流对象应该用fstream类定义,不能用ifstream或者ofstream。
16、ASCII文件的打开方式不能是ios::in|ios::out,不能读写同时进行。以这种方式打开ASCII文件,如果只进行读或写一种操作,则不出问题。若读写同时进行,则会出问题。
17、常对象的数据成员均为常变量,但常对象的成员函数只有显式用const修饰时才是常函数。通过常对象只能调用常成员函数,不能调用非常成员函数。常对象的数据成员均不可改变。如果确实有需要改变一个常对象的某个数据成员,可以将该数据成员声明为mutable,这样可以通过该常对象的const成员函数来修改它的值。
18、常成员函数既可以引用常数据成员,也可以引用非常数据成员,但常成员函数不能改变数据成员的值。常成员函数不能调用非常成员函数。