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.

  • 相关阅读:
    高速排序
    Android 中实现分享和第三方登陆---以新浪微博为例
    linux下用mail发送邮件
    hello.c内核模块编译 -- linux内核
    最小生成树
    JDBC连接Oracle数据库
    解决方案:zabbix(WEB界面的提供分布式系统监视以及网络监视功能)
    Grunt:grunt-tmod
    打包器:Webpack
    模板:art-template-loader
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4099261.html
Copyright © 2011-2022 走看看