很少你会遇到一个不包含原始指针的类 但默认的复制构造函数是不够的。这方面的一个例子 是你有一个参考计数对象。升压:: shared_ptr的<>是 示例
有人可以详细说明吗?如果我们有一个包含boost::shared_ptr
的类,那么在类构造副本时不会构造复制 - 因此shared_ptr
构造函数不会做正确的事情并增加引用计数吗?例如,以下代码正确复制Inner
- 为什么这对shared_ptr
不起作用?:
#include <iostream>
using namespace std;
class Inner
{
public:
Inner() { cout << "inner default constructed" << endl;}
Inner(const Inner& other) { cout << "inner properly copied" << endl;}
};
class Outer
{
Inner i;
};
int main() { Outer o; Outer p(o); return 0;}
答案 0 :(得分:16)
默认的复制构造函数将为每个成员变量使用复制构造函数,或为内置类型使用逐位复制。
如果您正在使用某种类型的共享指针,则复制构造函数将增加共享计数,原始对象和新对象都将指向同一对象。
在某些情况下,这就是你想要的;复制指针并正确管理引用计数,以便在不再使用资源时释放资源。
引用文章的背景是复制整个对象。在这种情况下,每个对象都应该有自己的子对象副本,而不是与其他实例共享子对象。在这种情况下,shared_ptr
可能是错误的选择,绝对不会深层复制子对象。
该段落措辞严厉,但我确信它正在谈论深层复制但是说shared_ptr
不会提供深层复制。这是真的,因为那不是它的设计目的。
答案 1 :(得分:6)
有人可以详细说明这个吗?
不是真的;这是胡言乱语。
如果我们有一个包含
boost::shared_ptr
的类,那么在类构造副本时不会构造复制 - 因此shared_ptr
构造函数不会做正确的事情并增加引用算?
没错。 shared_ptr
设计合理,具有有效的复制语义,因此在复制包含一个对象的类对象时无需特别处理。
可能,作者意味着如果你想复制而不是共享共享对象,那么你需要一个复制构造函数来创建一个新的。但是,如果您不想要共享所有权,那么使用shared_ptr
会很奇怪。
答案 2 :(得分:1)
我认为这意味着新类将引用旧类的资源,您可能希望在新类的旧资源中创建一个副本,如果它是类的完整成员就会发生。要么是可以接受的 - 这取决于你在做什么。
例如,如果你复制一只狗,而一只狗有骨头,那么这只新狗会得到它自己的骨头,还是会分享原始骨骼?