钱能C++语言读书笔记(二)
1、 有内存申请,也就有内存释放。一般来说,需要定义拷贝构造函数的类,也需要析构函数,不需要拷贝构造函数的类,也无须定义析构函数。所以析构函数与拷贝构造函数是成对出项的。
因为析构函数是没有参数的所以函数形式是唯一的,没有重载的析构函数。
析构函数在对象的生命周期行将结束的瞬时,由系统自动调用。因此,析构函数的调用不是通过显示语句表示的。
2、 转换构造函数
构造函数:Student(const string & s);即是初始化的对象创建方式,也是在告知如何将string
对象转换成一个Student对象。
3、 对象赋值
对象拷贝就是对象赋值
Person p1(“Ranny”);
Person p2 = p1; //对象赋值
类机制中有默认的赋值操作符,只要定义了类,就可以进行对象的赋值操作。但是默认的赋值操作符只管对象本体的复制,如果对象之间要深拷贝的话,则必须自定义赋值操作符。自定义赋值操作符必须注意,原来的对象已经存在,要先将原来的资源释放掉,然后再进行深拷贝式的复制。
运行结果:
赋值操作的参数与拷贝构造函数的参数是一致的,只有在功能上,赋值操作不管创建,只管复制。
赋值操作(=)的返回值必须是引用返回,这是为了与赋值操作符的语义一致。因为赋值操作的结果是一个可以递进操作的左值。
例如:
int a;
(a = 6)++; // a = 7;
如果赋值操作是临时对象,就不会有递进操作的能力,而且因为要额外创建对象,还要浪费空间和时间性能。所以赋值操作的返回不应该是临时对象。
4、 任何类,C++都有一个默认的赋值操作符,用来进行对象本体的复制。赋值操作符重载一般是在对象本体和对象实体不一致时,为了实现对象本体复制操作以外的操作而进行的。重载了赋值操作符,默认的赋值操作符就不复存在了。一般来说,赋值操作符是与拷贝构造函数和析构函数结对而行的。
5、 无参构造函数,也许是每一个类都必须具备,因为没有无参构造函数的类,无法具有class A {public: A(int);}; A a;的创建方式,也无法以默认的方式创建数组或向量,更无法以该对象的名义申请动态内存空间。如果一个类一定要设计成没有无参构造函数的形式,那一定是想限制类的创建方式。
6、 构造函数失败时的解决办法为异常处理。
7、 头文件的友元函数设计成inline,而inline函数若非类成员,则是一定要放在头文件中定义。