C++大学基础教程笔记(一)
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)。