1、初始化所有指针。
2、
(1)指向常量的指针:
(2)常量指针:指针本身为常量:
3、若循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。
4、字符数组要注意字符串字面值结尾处还有一个空字符。
5、数组的指针及数组的引用
6、C++中多维数组指的是数组的数组。
7、要使用for循环语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应是引用类型。
8、异常检测&异常处理
throw&try(catch)
9、如果函数无需改变引用形参的值,最好将其声明为常量引用。
10、(1)构造函数
是成员函数的一种,可以有参数,不能有返回值(void也不行)。
作用是对对象进行初始化,例如给成员变量赋初值。若定义类时没有写构造函数,编译器会生成默认的无参数的构造函数,不进行任何操作。
对象生成时构造函数自动被调用,对象一旦生成,就不能在其上执行构造函数。
一个类可以有多个构造函数。
(2)拷贝构造函数
几个原则:
C++ primer p406 :拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。当该类型的对象传递给函数或从函数返回该类型的对象时,将隐式调用拷贝构造函数。
X::X( X& ) X::X(const X &)
二者选一,后者能以常量对象作为参数。
C++支持两种初始化形式:
拷贝初始化 int a = 5; 和直接初始化 int a(5); 对于其他类型没有什么区别,对于类类型直接初始化直接调用实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数,也就是说:
A y = x; //拷贝初始化,是初始化语句非赋值语句,会调用拷贝构造函数,与下一条代码等价 A y(x); //调用拷贝构造函数
必须定义拷贝构造函数的情况:
只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义拷贝构造函数也可以拷贝;有的类有一个数据成员是指针,或者是有成员表示在构造函数中分配的其他资源,这两种情况下都必须定义拷贝构造函数。
什么情况使用拷贝构造函数:
类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
- (1)用一个对象去初始化同类的另一个对象。
- (2)若某一个函数有一个参数是类A的对象,那么该函数在被调用时,类A的拷贝构造函数将被调用。
- (3)如果函数的返回值是类A的对象,则函数返回时,A的拷贝构造函数将被调用。
(3)特殊的构造函数:类型转换构造函数:
实现类型的自动转换。
特点:只有一个参数,且不是拷贝构造函数。在使用时,编译系统会自动调用,建立一个临时对象/临时变量。
(4)析构函数
特点:名字与类名相同;前面加~;没有参数和返回值;一个类最多有一个析构函数。
对象消亡时自动被调用:释放分配的空间
编译期自动生成的缺省析构函数不涉及释放用户申请的内存释放等清理工作。
对象数组的生命期结束时,对象数组的每个元素的析构函数都会被调用到。
先构造的后析构。
11、静态成员 static:静态成员变量、静态成员函数,不需通过对象就能访问,本质是全局的。
普通成员变量每个对象各自有一份,静态成员变量一共一份,被所有成员共享。必须在定义类的文件中对静态成员变量进行一次说明/初始化,否则编译能通过,链接无法通过。
sizeof运算符不会计算静态成员变量。
calss CMyclass { int n; static int s; }; 则 sizeof(CMyclass) = 4
普通成员函数必须具体作用域某个对象,而静态成员函数并不具体作用于某个对象。
- 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
- 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。
12、类的多继承之环状继承
13、纯虚函数
想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
告诉编译器,函数没有主体,上面的虚函数是纯虚函数。
14、常引用不能对实参值进行改变。
指向常量的指针,也叫指针常量,该指针变量指向的是一个常量,指针所指的常量不允许改变,但是该指针可以指向其他地址。
常量指针又叫常指针,指的是声明的一个指针变量是一个常量,不可通过常量指针改变其指向的内容。但是该指针所指的对象是可以发生改变的。
不能把常量指针赋值给非常量指针,反过来可以。除非强制类型转换,例如:(int *)
函数参数为常量指针时,可以避免不小心改变参数指针所指向地址的内容。
15、用new实现动态内存分配
分配变量:P=new T; eg:
int *p; p=new int; *pn=5;
分配数组:P=new T[N];
int *p; p = new int[100; p[10]=12;
new的返回值类型 T*
用delete释放内存空间:
delete p; delete []p;
16、内联函数:
函数调用都是有开销的,若某个函数执行快但被调用很多次,开销大,使用内联函数。编译器处理对内联函数的调用语句时,将整个函数代码插入到调用语句处,而不会产生调用函数的语句。
inline int max(int a,int b) { if(a>b) return a; return b; }
内联成员函数:(1)inline (2)将整个函数体放在类定义的内部
17、函数重载:一个多个函数,名字不同但参数个数或参数类型不同。
18、类成员可访问范围
public public protected
类的成员函数内部可以访问:(1)当前对象的全部属性、函数 (2)同类其他成员的全部属性、函数
类的成员函数以外的地方只能访问类对象的公有成员(public)
19、负数用十六进制表示,首先将其表示为二进制,变反码再变补码
20、成员对象
成员对象:一个类的成员变量是另一个类的对象。包含成员对象的类叫封闭类。
使用初始化列表设计封闭类的构造函数:类名::构造函数(参数表):成员变量1(参数表),成员变量2(参数表),......{......}
成员函数初始化列表里的参数:任意复杂的表达式;函数/变量/表达式中的函数,变量有定义。
当封闭类对象生成时,先执行所有成员对象的构造函数,再执行封闭类的构造函数。成员对象的构造函数调用顺序与成员对象在类中的说明顺序一致,与在成员函数初始化列表中出现的顺序无关。
21、友元(friend)
(1)友元函数:一个类的友元函数可以访问该类的私有成员;将一个类的成员函数(包括构造、析构函数)定义为另一个类的友元。
(2)友元类:A是B的友元类,则A的成员函数可以访问B的私有成员。Note:友元类之间的关系不能传递、不能继承。
22、this指针:指向成员函数所作用的对象
Note:静态成员函数中不能使用this指针!因为静态成员函数并不具体作用于某个对象,因此静态成员函数的真实参数个数就是程序中写出的参数个数。
23、常量
(1)常量对象 const
(2)常量成员函数:类的成员函数说明后面可以加const。
执行期间不应修改其所作用的对象,因此,常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)。
Note:两个成员函数,名字和参数表都一样,但一个是const,则算函数重载。
(3)常引用 const int &r = n
不能通过常引用改变其引用的变量 ,一般可作为函数参数。
void PrintObj(const Sample &o)