EffictiveC++之了解c++默认编写并调用那些函数

来源:互联网 发布:java 虚拟文件系统 编辑:程序博客网 时间:2024/06/09 23:20

若一个类没有人为的编写,那么编译器将会自动生成:

一个默认的构造函数myclass(){}

一个默认的拷贝构造函数myclass(const myclass& rhs){}

一个默认的析构函数~myclass(){}

一个默认的拷贝复制函数myclass& operator=(const myclass& rhs){}

以上所有都是public inline的

当你调用的时候,编译器就会创建他们,而不调用的时候则不会创建。

另外编译器产生的析构函数是非virtual的,除非这个类的父类中的析构函数是虚函数,那么这个类的默认析构函数也是虚函数。

默认的拷贝构造函数和拷贝复制函数都是将来源对象的每一个非静态成员拷贝给了目标对象。默认的构造函数则将每一个非静态成员初始化为该类型的默认值。如果成员也是一个类对象的话,那么就调用成员类的默认构造函数。

如果你自己写了一个自定义的构造函数,那么编译器就不会为你生成一个默认的了,如果想有无参数的构造函数,那你得自己写。

当类内的成员有引用的时候,拷贝构造函数和=号赋值函数都不能调用,因为这样被赋值的对象里的引用成员指向的对象就会改变,而引用初始化之后是不准更改指向的对象的。所以编译器拒绝编译这种语句,如果想改变引用所指向的对象里存的值,则我们必须定义自己的拷贝构造函数和赋值重载。

同理,const成员也一样,必须定义自己的copy和assign函数来处理他们,否则不会通过编译。

同样,如果基类中的assign函数是私有的,那么将无法自动的生成一个子类的assign函数,毕竟编译器假设子类的assign能够使用基类的assign,但是基类的竟然是私有的无法使用,编译器不会知道怎么办,所以拒绝编译。



总之,编译器自己生成的函数,要考虑是否覆盖,是否有引用、const、是否能够准确无误的层层调用。若不是,则需要自己定义这些函数。

原创粉丝点击