我有复制构造函数概念的问题。我写了一个这样的例子:
struct f1
{
string x;
string y;
f1();
~f1();
};
struct f2
{
int a;
string b;
f1 *ff;
f2();
~f2();
};
class myclass{
f2 *obj;
}
我发现struct f2应该有一个拷贝构造函数,因为该类包含一个指向已分配内存的指针。但我不知道应该如何创造它。
答案 0 :(得分:0)
你有很多选择:
主要二:
只需复制指针(浅层复制),只需不编写构造函数,它就是隐式的,或者你可以写(在struct f2
中)。
f2(const f2 &original): f1(original.f1), a(original.a), b(original.b) { }
警告: 这将 NOT 复制
f1
成员变量的值。它只会复制引用,这会使f2.f1
s 引用到同一个f1
对象。f2 a; ... f2 b(a); // Invokes the "copy" constructor a.f1->x = "Something here"; std::cout << b.f1->x; // Will print "Something here"
制作深层副本,调用f1
的复制构造函数,并将新创建的副本分配到this->f1
struct f2
f2(const f2 &original): f1(new f1(*original.f1)), a(original.a), b(original.b) { }
另外一位评论者建议,您必须也会进行复制分配,因为您制作了一个复制构造函数(例如,如果您的对象是不可变的,则除外)
f2 &operator=(const f2 &other) {
if (this == &other) return; // If "self-assignment" just return.
if (f1) { delete f1; } // Deletes the old one if any.
// The advisable alternative is to use
// a smart pointer
f1 = new f1(*other.f1);
a = other.a;
b = other.b;
return *this;
}
无论如何,您应该考虑使用智能指针:unique_ptr
,shared_ptr
和weak_ptr
,因为原始指针可能会导致很多错误。但智能指针(部分)为您管理内存,让您有更多机会思考您的逻辑。一些现代C ++程序员说你应该很少使用delete
,智能指针会做这项工作
答案 1 :(得分:-2)
它几乎是一个普通的构造函数,它将自己类型的实例作为参数
f2(const f2& other):a(other.a),b(other.b),ff(new f1()){
memcpy(ff,other.ff,sizeof(f1));//makes copy of ff
}