zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    ASP.NET:在一般处理程序中通过 Session 保存验证码却无法显示图片?
    HTML中哪些标签的值会被提交到服务器呢?
    Java泛型之Type体系
    Java 调用 shell 脚本详解
    quartz详解2:quartz由浅入深
    Java 服务端监控方案(四. Java 篇)
    Apache Storm 学习资料
    开源框架是如何通过JMX来做监控的(一)
    Kafka Streams简介: 让流处理变得更简单
    linux 技巧:使用 screen 管理你的远程会话
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4099261.html
Copyright © 2011-2022 走看看