C++ 零碎知识点
C++的一些知识点比较零碎,下面清单的形式做一些记录与归纳,以供参考。
1、赋值操作符重载(深复制):
(1)由于目标对象可能引用了以前的一些数据,所以应该先delete这些数据;
(2)注意到对象可能对自己赋值,所以应该加上下面语句(another表示另一个对象),再进行(1)的操作:
(3)函数返回一个指向调用对象的引用;
(4)赋值操作符只能通过成员函数重载。
2、静态类成员函数:
(1)静态类成员函数在类的声明中要加static关键字,而在定义中则不用;
(2)静态类成员函数没用this指针;
(3)如果静态类成员函数是在公有部分中声明,则可以使用类名和域解析操作符来调用它。
(4)静态成员函数只能调用类的静态数据成员,而类的静态数据成员不能在构造函数中初始化,需独立初始化。
3、构造函数中new的使用:
(1)如果在构造函数中使用了new来初始化指针成员,则应该在析构函数中使用delete;
(2)new和delete需对应,new对应delete,new[]对应delete[];
(3)如果有多个构造函数,则必须使用相同的方式调用new,要么都是new,要么都是new[],因为析构函数只有一个,因此所有的构造函数都应该和它兼容。
4、有关函数返回对象:
(1)返回const对象的引用:
<1>返回对象会调用复制构造函数,而返回对象的调用则不会,因此效率会有所提高;
<2>引用指向的对象应该在函数执行时存在。
(2)返回非const对象的引用,一般有两种情况:
<1>重载赋值操作符,使其能够连续赋值;
<2>重载与cout一起使用的<<操作符,使其能够串接输出,返回形式为: ostream & 。
(3)返回非const对象:
假如返回的对象是函数中的局部变量,则不能返回引用,而应返回对象,因为函数执行完局部变量会被销毁,引用将会失效,而返回对象则会调用复制构造函数,生成临时对象。
5、指针与对象小结:
(1)常规声明方法:
MyVector *p;
(2)可以将指针初始化为指向已有的对象:
MyVector *p = & array[0];
(3)使用new并通过调用类的构造函数来初始化指针,这将创建一个新的对象:
MyVector *p = new MyVector(0,0,0);
6、析构函数的调用:
(1)如果对象是动态变量,那么当函数执行完定义该对象的程序块时,将调用其析构函数;
(2)如果对象是静态变量,则在程序结束时会调用其析构函数;
(3)如果对象是通过new创建的,只当显示使用delete删除对象时才会调用析构函数。
7、成员初始化列表:
构造函数可用成员列表为方法对成员数据进行初始化。例如:
(1)这种格式只能运用于构造函数中;
(2)必须使用这种方法来初始化非静态const数据成员;
(3)必须使用这种方法来初始化引用数据成员。
8、重载操作符:使用成员函数还是非成员函数?
对于大部分操作符来说,两种方式都可以实现操作符的重载, 下面以重载一个虚数类的加法为例:
(1)成员函数版本(只有一个参数);
(2)非成员函数(友元函数)版本(有两个参数,函数定义不用加类名限定):
一般来说,除了部分操作符只能使用成员函数进行重载之外,使用这两种格式没有太大的区别。当然,重载是只能二者选一,不然会被认为是重复定义而报错。
//To be continued.