类基本运算符

时间:2010-05-08 12:37:43

标签: c++

是否有必要在只有静态数据成员,没有指针的类中使用复制构造函数,析构函数和运算符=

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;
     }
};

我读到编译器为我们构建一个,所以最好没有一个(当我们添加数据成员时,我们必须更新运算符)

3 个答案:

答案 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可以复制和交换习惯用法。