CPP Object Model Copy Constructor

和default constructor一样,copy constructor也是在必要的时候才由编译器产生出来。

bitwise copy semantics

当用户不显示提供copy constructor的时候, 对于copy constructor和copy assignment operator操作, 编程器最直接的方法是施行default memberwise initialization:

  • 对于基本类型的data member,内存拷贝
  • 对于member class object,递归实行memberwise initialization

这也称为bitwise copy semantics(位逐次拷贝)。 这种机制并不需要编译器隐式合成copy constructor。

合成copy constructor

在以下情况下class不实行bitwise copy semantics,即需要编译器隐式合成copy constructor:

  • class内含一个member object, 而后者的class声明有一个copy constructor(无论是用户显示声明或编译器隐式合成)
  • class继承一个base class, 而后者存在一个copy constructor(无论是用户显示声明或编译器隐式合成)
  • class声明了一个或多个virtual functions
  • class继承链中有一个或多个virtual base classes

对于隐式合成的copy constructor,其操作是:

  • 对于基本类型的data member,内存拷贝
  • 对于没有声明copy constructor的member class object/base class,递归实行bitwise copy semantics
  • 对于声明了copy constructor的member class object/base class,调用其copy constructor
  • 如果class声明了一个或多个virtual functions,调整vptr(不能直接内存拷贝,因为被拷贝的const class reference可能是一个派生类对象,vptr指向不同的vtbl)
  • 如果class继承链中有一个或多个virtual base classes,调整virtual base class共享机制

除了virtual机制, 需要编译器隐式合成copy constructor的根源是member class object及其递归member class object有一个显示声明的copy constructor。

NRV(Named Return Value)/RVO(Return Value Optimization)

NRV的触发?需要用户定义copy constructor? 如果是,那么用户定义一般情况下用户定义copy constructor就有必要。