作者:梦天使悠然 | 来源:互联网 | 2023-08-10 15:37
复制对象会用到两个函数,我们将下面两个函数统称为复制函数。复制构造函数赋值运算符编译器不会提醒你忘了复制哪些东西如果我们自己没有实现,则编译器会帮我们实现。编译器的实现会复
复制对象会用到两个函数,我们将下面两个函数统称为复制函数。
编译器不会提醒你忘了复制哪些东西
如果我们自己没有实现,则编译器会帮我们实现。编译器的实现会复制所有的 成员变量。
如果我们自己实现了,也一定要像编译器一样复制所有的成员变量。但如果你忘了某一个,编译器也不会提醒你。
别忘记调用基类的复制函数
在派生类的复制中,一般情况下我们只会看见它本身的一些成员变量。当然这些值是不容易被忘记。但是基类是隐含在派生类后面的,很容易就被忽略。
如果我们仅仅复制了派生类的成分,而忽略了基类。那么复制得到的新的对象将会调用派生类的默认复制函数。
如果没有默认复制函数,或者参数不匹配编译器会报错。但不管怎样,这都属于严重的错误。
因此在重写复制构造函数时,要先调用基类的复制构造函数。同理,在赋值运算符重载函数中,也要先调用基类的赋值运算符重载函数。
不要相互调用复制构造函数和赋值运算符重载
在构造函数中调用赋值运算符是个荒谬的想法,因为我们试图赋值一个不存在的对象。构造函数是为了构造被复制的函数,而里面的实现如果是赋值运算符重载的话,就默认了左边那个要被赋值的对象是存在的。但实际上这个对象是不存在的。因为在复制构造函数结束以前,这个对象都处于初始化中。
在赋值运算符中调用构造函数也是个荒谬的想法,因为我们试图构造一个已经存在的对象。
如果这两个函数实现方法差不多的话,可以写一个公有函数,然后在两个复制函数里面调用这个方法。