c++ - 复制构造函数首先复制指针,然后取消引用它以获得 "deep"拷贝

标签 c++ copy-constructor

我正在查看 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c22-make-default-operations-consistent 中的以下(错误)示例代码:

class Silly {   // BAD: Inconsistent copy operations
    class Impl {
        // ...
    };
    shared_ptr<Impl> p;
public:
    Silly(const Silly& a) : p{a.p} { *p = *a.p; }   // deep copy
    Silly& operator=(const Silly& a) { p = a.p; }   // shallow copy
    // ...
};

作者试图说明复制c'tor和复制分配之间的不匹配,但我想知道代码是否在其他方面存在缺陷。

“深拷贝”构造函数有意义吗?看起来在进入正文时,p 将与 a.p 相同,并且自分配不会执行任何操作(最多)。

我错过了什么吗?

最佳答案

确实,这只是一堆废话。

大概这就是这个例子的要点,尽管我不相信这是一个很好的例子。

否则作者的意思可能是:

Silly(const Silly& a) : p{std::make_shared<Impl>()} { *p = *a.p; }

或者:

Silly(const Silly& a) : p{std::make_shared<Impl>(*a.p)} {}

或者类似的东西。

关于c++ - 复制构造函数首先复制指针,然后取消引用它以获得 "deep"拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54054745/

相关文章:

c++ - 使用 InterlockedIncrement64 的引用计数对象的复制构造函数的原子性

c++ - 如果 C++ 类同时包含 const 引用和非 const 引用复制构造函数怎么办?

c++ - 我可以分离内部 std::future 线程吗?

c++ - 如何捕获在 Qt C++ 中调用 setStyleSheet() 时打印的错误?

c++ - 无法将QString转换为Const Char *

c++ - 在 C++ 中创建对象的拷贝

c++ - 在 printf 上输出

c++ - 为什么我不能导致段错误?

c++ - 为什么 C++ 选择将我的返回值转换为 int?

c++ - 在用户定义的复制构造函数中使用隐式复制构造函数