复制构造函数的目的之一是使复制中指定的指针指向它们各自的成员,而不是简单地返回到原始成员,但这究竟是如何实现的?
说你的构造函数是:
foo::foo(int i)
{
blah = i;
bar = new whatever; //bar is a pointer to a whatever
}
那么复制构造函数的实现应该是什么样的呢?是你必须要做的唯一事情:
bar = this->whatever;
或
bar = whatever;
还是应该包含普通构造函数的所有内容?
答案 0 :(得分:1)
这完全取决于foo
是什么,以及它与whatever
的关系。
可能的选择是:
分享对象
foo::foo(const foo& other) : blah(other.blah), bar(other.bar)
{ }
创建另一个对象
foo::foo(const foo& other) : blah(other.blah), bar(new whatever)
{ }
创建对象的新副本
foo::foo(const foo& other) : blah(other.blah), bar(new whatever(*other.bar))
{ }
答案 1 :(得分:-1)
不,复制构造函数是关于复制对象的成员,它与指针没有太大关系,除非成员是。就像你有一个带point
和x
成员的对象y
一样,你可以创建一个复制构造函数
point(const point& p) : x(p.x), y(p.y) { }
它可能有另一个构造函数,如
point(int x_,int y_) : x(x_), y(y_) { }
如果你有一个指针成员,它取决于对象以及你想如何处理它 - 你可能想要复制指针或创建另一个指针等。取决于它指向的数据。
答案 2 :(得分:-1)
如果您没有复制构造函数,将为您创建一个默认的复制构造函数,其中浅复制,其中一个对象的每个成员变量只是分配给另一个,而不是到深层复制。
因此,如果你有一个指向动态分配缓冲区的指针,那么默认的复制构造函数将简单地将该指针分配给副本的指针,而不是创建它自己的new
缓冲区来指向和复制内容缓冲区进入新的缓冲区。例如
class DynamicIntArray {
private:
int *_array;
size_t _size;
public:
DynamicIntArray(size_t size) : _array(new int[size]), _size(size) { }
DynamicIntArray (const DynamicIntArray &d) // copy constructor
{
delete[] _array;
_array = new int[d._size];
_size = d._size;
std::copy(_array, d._array, d._array + d._size);
}
/* destructor, assignment operator, etc */
};
如果您没有创建默认的复制构造函数,那么创建的默认复制构造函数只会将d._array
分配给_array
,这会导致严重的问题。即。而不是上述,它会做:
_array = d._array;
_size = d._size;
请注意,如果您有一个复制构造函数,您可能应该有一个赋值运算符和一个析构函数(查找三个规则)。