对象之间的拷贝操作
发生对象之间拷贝操作的三种情况:
- 用一个 object 对另一个 object 进行初始化操作
- 当 object 被用作函数参数时
- 当一个函数返回值为一个 object 时
如果一个 class
明确定义了 copy constructor
,那么在上述几种情况中会调用该 copy constructor
,但如果一个 class
没有定义 copy constructor
呢?转载请注明出处: http://glgjing.github.io/ 。
memberwise Initialization
memberwise Initialization
的规则是:把每一个内建活继承来的 data member
从一个 object
拷贝到另一个 object
,但并不会拷贝 member class object
,而是以递归的方式对 member class object
施行 memberwise Initialization
。这样的操作是如何完成的呢?
从概念上而言,对于一个 class X
,这个操作是被一个 copy constructor
实现出来…
之所以是“从概念上”,也就是实际上并不是完全由 copy constructor
实现的。
一个良好的编译器可以为大部分 class object
产生 bitwise copies
,因为他们有 bitewise copy semantics
…
bitewise copy semantics(位逐次拷贝)
bitewise copy semantics
(位逐次拷贝)顾名思义就是把一个 object
的内容按位拷贝给另一个 object
。如果在 bitewise copy semantics
完全可以满足一个 class
的拷贝操作的情况下,编译器是不会合成 copy constructor
。但在有些情况下单纯的 bitewise copy semantics
不能满足拷贝操作,也就是说编译器在一个 class
不会表现出 bitewise copy semantics
时,需要合成 copy constructor
来完成拷贝操作。一个 class
不会表现出 bitewise copy semantics
的四种情况:
- 当
class
内含有member object
,而且后者的class
声明里有一个copy constructor
,不管是class
的设计者明确声明的,还是被编译器合成的。 - 当
class
继承一个base class
,而后者含有一个copy constructor
(不管是明确声明的还是编译器合成的)。 - 当
class
还有virtual functions
时。 - 当
class
派生链中有virtual base classes
时。
编译器合成 copy constructor 做什么?
- 调用
member object
以及base class
的copy constructor
。 - 重新设定
virtual table
的指针。 - 处理
virtual base class subobject
总结
Default constructor
和 copy constructor
在必要的时候才由编译器产生出来。
其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。
网友评论