1.修改const对象的任何企图在编译时就会被发现,而不是等到执行期才导致错误。
2.将变量和对象声明为const可以提高性能,编译器可以对常量提供某些相对变量来说不能提供的优化。
3.对于const对象,C++编译器不允许进行成员函数的调用,除非成员函数本身也声明为const。
4.要将函数指定为const的,则既要在其原型中指定,又要在其定义中指定。方法是在函数参数列表后和函数开始的左花括号(对定义来 说)前插入关键字const。如:int getHour() const {}。
5.将修改对象的数据成员的成员函数定义为const将导致编译错误。
6.定义为const的成员函数如果又调用同一类的同一实例的非const成员函数,将导致编译错误。
7.可以对const成员函数进行非const版本的重载。编译器将根据调用函数的对象性质选择相应的重载函数来使用。
8.构造函数和析构函数都会修改对象,所以不能将它们声明为const。
9.const数据成员和引用的数据成员必须使用成员初始化器进行初始化。最好将所有运行时不修改对象的成员函数都声明为const。
10.组成:即一个类将其他类的对象作为成员。
11.当一个类的成员初始化器初始化作为成员的其他类的对象时:编译器提供给每个类一个默认的复制构造函数,该函数将构造函数的参 数对象的每个成员复制给将要初始化的对象的相应成员。书本343页有写。
12.对象是由内而外进行创建,而撤销是按相反的顺序(即,Date成员对象在包含它们的Employee对象撤销后再撤销)。
13.类类型成员的对象必须是private的,就像其他数据成员一样。
14.类的friend函数在类的作用域外定义,却具有访问类的非public成员的权限。单独的函数或整个类都可以被声明为另一个类的友元。
15.即使friend函数的原型在类定义内出现,友元仍不是成员函数。
16.使用this指针:在一个类中,所有的对象的成员函数是公共的,那么,成员函数如何知道哪个对象的数据成员要被操作呢?每个对象 都可以使用一个称为this的指针来访问自己的地址。对象的this指针不是对象的一部分,也就是this指针占用的内存大小不会反映在 对对象进行sizeof运算得到的结果中。相反,this指针作为一个隐式的参数(被编译器)传递给对象的每个非static成员函数。
17.this指针的类型取决于对象的类型及使用this的成员函数是否被声明为const。例如,在Employee类的非const成员函数中,this指针 具有的类型是Employee *const(一个指向非const Employee对象的const指针)。可使在Employee类的const成员函数中,this指针 具有的类型却为const Employee *const(指向一个const Employee对象的const指针)。
18.this指针的另一种用法是使串联的成员函数调用成为可能。
19.默认的构造函数:将私有的数据成员初始化为默认的值,可以在调用时不带任何实参。每个类最多只有一个默认构造函数。
20.static类成员:仅有变量的一份副本供类的所有对象共享。这样的变量表示了“整个类范围意义上”的信息。
21.基本类型的static数据成员默认情况下将初始化为0.int或者枚举类型的const static数据成员可以在类定义中的声明处初始化。但 是,所有其他static数据成员必须在文件作用域(换言之,在类定义体之外)进行定义,并只能在那些定义中初始化。
22.即使不存在已实例化的类的对象,类的static数据成员和static成员函数仍存在并且可以使用。staitc成员函数只能访问类的static 数据成员
23.当没有类的对象存在而要访问private或protected的static类成员时,应提供public static成员函数,并通过在函数名前加类名和 二元作用域分辨符的方式来调用此类函数。如:Employee::getCount()。
24.static成员函数不具有this指针。
25.不可重载的运算符:成员运算符(.),作用域运算符(::),条件运算符(?:),(.*)。
26.重载不能改变运算符的优先级,不能改变运算符的结合律,不能改变运算符的“元数”。
27.运算符函数的参数至少有一个必须是用户自定义类型的对象或引用。这样使程序员不能改变运算符作用在基本类型上的方式。如,程 序员不能改变+运算符用于两个整数相加时的含义。
28.当运算符函数作为成员函数实现时,最左边(或者只有最左边)的操作数必须是运算符的一个类对象(或引用)。如果左操作数必须 是一个不同类的对象或者是一个基本类型对象,那么该运算符函数必须作为全局函数来实现(如流插入和流提取运算符)。如果全局 运算符函数必须直接访问类的private或protected成员,那么该函数可以指定成该类的友元函数。
29.istream &input; string areaCode; input >> setw(3) >> areaCode; input.ignore(); setw(3)允许读入三个字符。ignore函数丢弃输入流中指定个数的字符(默认为一个)。
30.不需要修改C++的标准输入/输出类库,就能把全新的用户自定义类型的输入/输出特性添加到C++中。这是C++编程语言可扩展性的又 一个例证。
31.重载一元运算符: 类的一元运算符可以重载为不带参数的非static成员函数或者带有一个参数的全局函数。全局函数的参数必须是该类的对象或者引用。当重载成不带参数的成员函数且编译器遇到表达式!s时,编译器就会生成函数调用s.operator!()。声明如下:class String{ public: bool operator!() const;}; 当重载为全局函数时,编译器就会生成函数调用operator!(s)。声明如下:bool operator!(const String &);
32.类的二元运算符可以重载为带有一个参数的非static成员函数或者两个参数(其中一个必须是类的对象或引用)的全局函数。 当声明为成员函数时:class String{ public: bool operator<(const String &) const; }; y<z就会被处理成y.operator<(z)。 当声明为全局函数时:bool operator<(const String &, const String &); y<z会被处理成operator<(y,z)。