有三种情况,会以一个object的内容作为另一个class object的初值。
1.当对一个object做明确的初始化操作时
2.当object被当做参数交给某个函数时
3.当函数传回一个class object时
以上三种情况都会导致copy constructor的调用。
Default Memberwise Initialization
如果class没有提供一个explicit copy constructor,编译器会怎么做呢?
当class object以“相同的class的另一个object”作为初值时,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的data member的值,从某个object拷贝一份到另一个object身上,不过它并不会拷贝其中的member class object,而是以递归的方式(也就是继续调用member class object的copy constructor函数)施行memberwise initialization。
这样的操作实际上如何完成?ARM告诉我们:
“从概念上而言,对于一个class X,这个操作是被一个copy constructor实现出来...”
其中主要的字眼是“概念上”,这个注释又紧跟着一些解释:
“一个良好的编译器可以为大部分class objects 产生bitwise copies,因为它们有bitwise copy semantics...”
也就是说,“如果一个class未定义出copy constructor,编译器自动为它产生出一个”这句话不对,而是应该像ARM所说:
“Default constructor和copy constructor在必要的时候才由编译器产生出来.”
这个句子中的“必要”意指当class不展现bitwise copy semantics时。