我正在学习 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
?