本文共 1640 字,大约阅读时间需要 5 分钟。
1. 将const加在形参表之后,就可以将成员函数声明为常量。const成员函数不能改变所操作对象的数据成员。const必须同时出现在声明和定义中,跟static不同。
2. 在类内部定义的成员函数,将自动作为inline处理。
3. 因为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。但是,只要类名出现就可以认为该类已声明,所以可以使用指向自身类型的指针或引用。
4. 如果成员函数需要返回对其自身类型对象的引用,可以使用this指针。
return *this;
5. 普通的非const成员函数中,this的类型是指向类类型的const指针,可以改变this所指向的值,但不能改变this所指向的地址。在const成员函数中,this的类型是指向const类类型对象的const指针,既不可以改变this所指向的值,也不可以改变this所指向的地址。
6. 可变数据成员mutable永远都不能为const,甚至当它是const对象的成员时也如此。因此,const成员函数可改变mutable成员。
7. 可以初始化const对象、引用类型对象和没有默认构造函数的类类型,而不能进行赋值。所以应该用必须使用【构造函数初始化列表】初始化const对象、引用类型、无默认构造函数的类类型。
8. 在构造函数初始化列表中,成员被初始化的顺序是按照它们被定义的顺序。第一个被定义的成员首先初始化。
9. 一个类只要定义了一个构造函数,编译器就不会在生成默认构造函数。每个构造函数都应该为每个内置或复合类型的成员提供初始化式。没有初始化内置或复合类型成员的构造函数,将使那些成员处于未定义的状态。
10. 类通常应该有一个默认构造函数。如果没有,那么有这些缺点:
<1> 该类不能用作动态分配数组的元素类型
<2> 该类用作静态分配数组的类型时。必须为每个元素提供显式的初始化式
<3> 对象保存该类类型对象的容器,比如vector,不能使用【只接受容器大小而没有同时提供元素初始化式】的构造函数。
11. 隐式类类型转换,例:
类Class A有一个【单实参】的构造函数A(string str);而有某个普通函数B(A a),需要传递一个A类型的实参,此时如果传递一个string类型,即B(str)。则会完成一次隐式类型转换,利用该构造函数,将string类型转换成Class A的一个对象。
如果想要防止隐式类型转换,可以使用explicit关键字,在本例中是explicit A (string a);
explicit关键字只能用于类内部的构造函数声明上,在类外进行定义时不再重复它。
通常,单形参构造函数应该是explicit,可以避免错误。
12. 对于没有构造函数而且全体数据成员均为public的类,可以采用与初始化数组元素相同的方式来初始化其成员。根据数据成员的声明次序来使用初始化式。
13. 友元friend机制允许将类的非公有成员的访问权授予指定的函数或者类。友元声明以关键字friend开始,只能出现在类内部。
如果将一个类设为友元,则友元类的所有成员函数都可以访问授予友元关系类的非公有成员。
14. 友元函数可以在类的内部定义,该函数的作用域扩展到【包围该类定义的作用域】。
15. static数据成员独立于该类的任意对象而存在。static成员函数没有this形参。
当我们在类的外部定义static成员时,无需重复使用static关键字,只需要在类内部声明时使用。
16. static成员不是通过类构造函数初始化,而应该在定义时初始化。
如果初始化式是一个【常量表达式】,那么const static数据成员可以在类定义体内部进行初始化。但是即使在类的定义体内部初始化,const static数据成员仍必须在类的定义体之外进行定义。
17. static数据成员的类型可以是该成员所属的类类型,与非static成员不同。
转载地址:http://zwbdi.baihongyu.com/