Copy constructor
当一个类展现出bitewise copy semantics时,编译器就会生成trivial 的copy constructor,否则生成non-trivial的copy constructor,两者的界定就是“是否编译器会额外安插代码”,不展现bitewise copy semantics的情况如下:
1. 当一个class内含有一个member object 而后者的class声明有copy constructor
2. 当class继承了一个定义了copy constructor的class
3. 当class声明了virtual function(设置vptr)
4. 当class派生自一个继承串链,其中有一个或多个virtual base class时(设置virtual_base_ptr)
C++标准说:把一个class object当做参数传递给一个函数,或者作为一个函数的返回值,相当于以下形势的调用:X xx=arg,其中xx代表形势参数而arg代表真正的参数值,其中,传递和返回分别的编译阶段转换如下:
传递:形如 void foo(X xx){} 的调用,会被编译器转换为:
// 伪代码
X tmp;// 定义一个临时变量
tmp.X::X(arg)// copy constructor初始化
void foo(X& xx) // 函数改成引用传递
//函数返回
tmp.X::~X()//析构临时变量
返
形如X bar(){},的调用,会被编译器转换成:
X ret;//提前定义返回变量
void bar(X &xx); //先给函数添加一个引用类型的参数
ret.X::X(xx)//之后在return之前安插一个copy contructor调用,改写后的函数不返回任何值(NRV优化)
return; // 返回
主动声明copy constructor会激活c++编译器当中的NRV{Named Return Value}优化
C++必须在成员初始化列表初始化的几项
1. reference member
2. const member
3. 调用基类的constructor
4. 调用一个member class的constructor
编译器会一一操作initialization list,以适当的顺序在constructor中安插初始化操作,并且在任何explicit user code 之前
阅读(1661) | 评论(0) | 转发(0) |