【发布时间】:2011-05-06 00:25:27
【问题描述】:
我正在学习 c++,我最近学习了(在堆栈溢出中)关于复制和交换习语的知识,我对此有一些疑问。因此,假设我有以下类使用复制和交换习语,例如:
class Foo {
private:
int * foo;
int size;
public:
Foo(size_t size) : size(size) { foo = new int[size](); }
~Foo(){delete foo;}
Foo(Foo const& other){
size = other.size;
foo = new int[size];
copy(other.foo, other.foo + size, foo);
}
void swap(Foo& other) {
std::swap(foo, other.foo);
std::swap(size, other.size);
}
Foo& operator=(Foo g) {
g.swap(*this);
return *this;
}
int& operator[] (const int idx) {return foo[idx];}
};
我的问题是,假设我有另一个类,它有一个 Foo 对象作为数据但没有指针或其他可能需要自定义复制或分配的资源:
class Bar {
private:
Foo bar;
public:
Bar(Foo foo) : bar(foo) {};
~Bar(){};
Bar(Bar const& other) : bar(other.bar) {};
Bar& operator=(Bar other) {bar = other.bar;}
};
现在我有一系列问题:
上面为
Bar类实现的方法和构造函数是否安全?使用了Foo的复制和交换功能后,请确保在分配或复制Bar时不会造成任何伤害?在复制构造函数和交换中通过引用传递参数是强制性的吗?
是不是说当
operator=的参数传值时,会为此参数调用拷贝构造函数来生成对象的临时拷贝,然后就是这个拷贝与*this交换?如果我在operator=中通过引用传递,我会有一个大问题,对吧?在复制和分配
Foo时是否存在此习惯用法无法提供完全安全性的情况?
【问题讨论】:
-
您的复制构造函数有一个相当严重的错误:它在设置
size之前执行foo = new int[size] -
Bar 中自定义的复制构造函数、赋值运算符和析构函数是完全没有必要的。还是你已经知道了?
-
西斯拉克:哎呀!感谢您指出。 Lindley:是的,我知道这完全等同于默认构造函数,为了明确起见,澄清我的问题。
-
+1:很好的问题,尤其是对于 C++ 初学者!
-
我强烈建议使用
std::vector<int>作为会员。那么你就不必一开始就编写析构函数和复制操作了。
标签: c++ class copy-constructor rule-of-three copy-and-swap