是否有必要在只有静态数据成员,没有指针的类中使用复制构造函数,析构函数和运算符=
class myClass{
int dm;
public:
myClass(){
dm = 1;
}
~myClass(){ } // Is this line usefull ?
myClass(const myClass& myObj){ // and that operator?
this->dm = myObj.dm;
}
myClass& operator=(const myClass& myObj){ // and that one?
if(this != &myObj){
this->dm = myObj.dm;
}
return *this;
}
};
我读到编译器为我们构建一个,所以最好没有一个(当我们添加数据成员时,我们必须更新运算符)
答案 0 :(得分:2)
如果您无法为析构函数做任何事情,那么除了基类中的虚拟析构函数之外,您几乎肯定不需要定义它。如果你不需要析构函数,你几乎肯定不需要定义复制构造函数和赋值运算符,也不应该这样做,因为很容易弄错它们。
答案 1 :(得分:0)
没有。编译器将自动复制构造,销毁和分配所有数据成员。这意味着如果你有一个提供它们的类,你就不需要写这些。我认为无论如何最好按照每个成员编写运算符。
答案 2 :(得分:0)
编译器会自己提供。默认情况下,复制构造函数/赋值运算符将复制/分配所有成员(如果派生类,则为对象的基本部分),并且析构函数不执行任何操作(调用所有成员/库的析构函数,但这是您可以'即使您提供了自己的更改,也会发生更改 - 这是在退出用户定义的析构函数的主体之后发生的。)
所以在这种情况下完全没必要。您所能实现的只是在代码中引入错误(例如,您添加了另一个成员,但忘记更新复制构造函数以复制它)。
myClass& operator=(const myClass& myObj){ // and that one?
if(this != &myObj){
this->dm = myObj.dm;
}
return *this;
}
我认为你不应该教条地“检查自我指派”。当你为自己分配一个int(甚至是间接的)时会发生什么不好的事吗?
int a = 10;
int& ref = a;
a = ref;
只有当赋值运算符首先销毁当前保存的资源,然后从右侧的对象创建新的资源时,才能避免自我分配。然后发现你实际上间接地摧毁了右手对象也是一场灾难。
但即使在这种情况下,最好首先创建右侧的副本,然后销毁左侧的内容,在这种情况下,自我分配没有问题(除了可能效率低下) 。为了实现这一目标的好方法,Google可以复制和交换习惯用法。