13. 构造函数:
(1)构造函数名字与类名相同;
(2)构造函数不指定返回类型,它隐含有返回值,由系统内部使用;
(3)构造函数可以有一个或多个参数,因此可以重载;
(4)在创建对象时,系统会自动调用构造函数。
14. 在构造函数中,初始化列表中各个初始化项的执行顺序取决于类成员在类中声明的顺序,而与初始化列表中给出的初始化顺序无关。
15. 析构函数:
(1)析构函数名是在类名前加求反(求补)符号~;
(2)析构函数不指定返回类型,它隐含有返回值,由系统内部使用;
(3)析构函数没有参数,因此析构函数不能重载,一个类中只能定义一个析构函数;
(4)在撤销对象时,系统会自动调用析构函数。
16. 类中有一种特殊的构造函数叫做复制构造函数,它用一个已知的对象初始化一个正在创建的同类的对象。
一般格式:
<类名>::<类名>(const <类名>& <引用对象名>)
{
//复制构造函数体;
}
17.
this指针是一个特殊的对象指针,它是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针可以知道自己属于哪个对象。
18. 对于类中的非静态数据成员,每一个类对象都拥有一个副本,即每个对象的同名数据成员可以分别存储不同的数值,这是保证每个对象拥有区别于其他对象的特征的需要。
而类中的静态成员则是解决同一个类的不同对象之间的数据和函数共享问题的。
静态数据成员的值对每个对象都是一样的,它的值可以被任何一个对象更新,从而实现了同一类的不同对象之间的数据共享。
在类体外对静态数据成员进行初始化,例如:int Point ::count=0;
19. 静态成员函数可以在类体内定义,也可以在类体外定义。当在类体外定义时,要注意不能使用static关键字作为前缀。
由于静态成员函数在类中只有一个副本,因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;
若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象进行访问。
20. 常对象
<类名> const <对象名>
//或者
const <类名> <对象名>
例如:const A a(1,2);
常成员函数
<返回类型> <成员函数名> (<参数表>) const;
例如: int GetYear() const {return yrar;}
int GetDay() const;
常数据成员
常数据成员的定义必须出现在类体中。
常数据成员同样必须进行初始化,并且不能被更新。但常数据成员的初始化只能通过构造函数的成员初始化列表显式进行。
21. 常对象只能调用常成员函数,不能调用一般成员函数;
一般对象两者都可调用。
22. 私有成员和保护成员只允许本类的成员函数和友元访问。
23. 类中定义的数据成员不能在类体内进行初始化,应在类的构造函数中进行初始化。
24. 用一个已知的对象初始化一个正在创建的同类对象时要调用复制构造函数,复制构造函数的参数是对同类的某一个对象的常引用。
25. this指针指向调用成员函数的类对象,它隐含与每一个非静态的类对象函数中。
26. 常数据成员的初始化必须通过构造函数的初始化列表显式进行。
27. static函数和普通函数的区别:
用static修饰的函数,限定在本源码文件中,不能被本源码文件外的代码文件调用,而普通的函数,默认为extern,也就是说,可以被其他代码文件调用该函数。
因此定义静态函数的好处是:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突;
<2>静态函数不能被其他文件所用。
28. C++98新增的标准模板库(STL)提供了模板类vector,它是动态数组的替代品。
C++11提供了模板类array,它是定长数组的替代品。