复制构造函数首先复制指针,然后取消引用它以获得 "deep" 副本
Copy constructor copies pointer first, then dereferences it to obtain "deep" copy
我正在查看 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 和复制分配之间的不匹配,但我想知道代码是否在其他方面存在缺陷。
"deep copy" 构造函数有意义吗?看起来在进入正文时,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)} {}
或类似的。
Silly(const Silly& a) : p{a.p} { *p = *a.p; }
除了复制底层 shared_pointer 之外,还会复制它指向的值。我担心的是 shared_ptr<T>::operator*
实际上 returns T&
,因此我们的赋值将更改控制块的值,实际上什么也没做。
但话又说回来,目的不是演示实际的深层复制,而是提供不一致的复制操作。
shared_ptr
的深拷贝看起来像这样
Silly(const Silly& a) : p{make_shared<Impl>(*a.p)} {}
我正在查看 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 和复制分配之间的不匹配,但我想知道代码是否在其他方面存在缺陷。
"deep copy" 构造函数有意义吗?看起来在进入正文时,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)} {}
或类似的。
Silly(const Silly& a) : p{a.p} { *p = *a.p; }
除了复制底层 shared_pointer 之外,还会复制它指向的值。我担心的是 shared_ptr<T>::operator*
实际上 returns T&
,因此我们的赋值将更改控制块的值,实际上什么也没做。
但话又说回来,目的不是演示实际的深层复制,而是提供不一致的复制操作。
shared_ptr
的深拷贝看起来像这样
Silly(const Silly& a) : p{make_shared<Impl>(*a.p)} {}