Default Copy Constructor 之 bitwise copy semantics 的讨论

如 default constructor 一般, 编译器也不会因为一个 class 没有 copy constructor 而产生出一个, 编译器只会在必要时才会产生一个 copy constructor, 而这个"必要" 则是指当 class 不展现 bitwise copy semantics 时.
问题来了, 什么是 bitwise copy semantics?

--------------吐槽的分割线-----------------------
关于这个, 我在网上找了不少博客, 结果很多都是描述性的解释, 而且还和 inside C++ Object Model 里的内容一样(也有不一样的, 比如配了个可有可无的图啊), 真不知道他们是真懂了还是当笔记用, 之后再慢慢消化的, 书里说 XX 是这样的: &*%(, 我看你博客想知道 XX 到底是什么意思, 你就回答我 XX 就是&*%(, 那看你博客有毛意思?
-----------------吐槽毕--------------------------

后来发现结合 C# 的一个概念来看, 似乎比较接近 bitwise copy semantics 的含义, 那就是 C++ 的"浅拷贝".
问题又来了, 什么是深拷贝? 什么是浅拷贝? 由于这里探讨的是 C++ 的 copy constructor, 因此简单地说, 如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝, 书里的 bitwise copy semantics 就是所谓的"浅拷贝", 而 memberwise 则是所谓的 "深拷贝".

这即是说, 只有对于 class 的拷贝不是浅拷贝的情况下, 编译器才会产生一个 default copy constructor.
那什么 class 不展现 浅拷贝的性质呢?
1. 当 class 内含一个 member object, 而后者的 class 声明有一个 copy constructor(无论是被 class 的设计者明确地 声明, 或是被编译器合成)时.
2. 当 class 继承一个含有 copy constructor(无论是被 class 的设计者明确地声明,或是被编译器合成)的 base class时.
3. 当 class 声明了 virtual class 时.
4. 当 class 派生自一个继承串链且其中含有一个或多个 virtual base classes 时.
对于前两种情况, 编译器的行为仍是安插与扩展, 与上一篇的行为类似, 故不多言.
而对于3, 因为是深拷贝, 编译器需要在为其重新分配新的资源并安置新的 vptr 并进行初始化, 因此需要产生一个copy constructor.

原文地址:https://www.cnblogs.com/wuOverflow/p/4099261.html