文章目录
拷贝构造函数是一个c++的默认成员函数,它是用来拷贝对象的,当你想修改对象,但是又不想修改它本身,那么可以将其拷贝给一个对象对这个拷贝出来的对象进行操作
拷贝构造函数语法:类名(const 类名&类对象)
以日期类为例:Date(const Date& d)
拷贝构造函数特征:
它是构造函数的一种重载形式:它只有一个显示参数,并且是类对象的引用
不是引用是完全行不通的,为啥?
因为函数在调用时,要先传参数,对于参数是内置类型,他没啥要求就是直接实参拷贝给形参,对于形参是自定义类型在函数调用时,参数传递会先调用它的拷贝构造,然后再执行改函数功能!
以d1做实参,调用fun函数,传参会先调用它的拷贝构造
调试观察!
如果参数不是引用,如果编译器不坚持那么就会一直调用下去
因为它的形参是自定义类型,相当于每次都是新定义的一个对象!而引用就是他自己的别名,他不是将一个对象的值给另一个对象!
拷贝构造函数因其是默认成员函数,那么当他没有被显示定义时,编译器也会自动生成的
只是它同构造函数对于内置类型成员变量的处理不同,构造函数是不处理内置成员变量的,拷贝构造函数会将值依次按字节拷贝给另一个对象!但是对于自定义类型的,它会去调用自己的拷贝构造函数
这里是没有写出它的拷贝构造函数的。
当自定义类型成员,它会去调用它的拷贝构造,那么如果这个拷贝构造并没有写出,它会自动生成且依次拷贝,就拿栈来说,若是动态申请的数组都按字节拷贝的话,两个栈会同时指向一块空间,那么当其中一个栈析构之后,另外一个也会对同一块空间再次析构依次,同一块空间是不能析构两次的额!并且当一个栈的改变会影响到另一个栈。这样于本意不符!而是要重新开与原栈相同的空间,然后按字节依次拷贝过去,这样就各自在各自空间,不用再担心析构两次的问题,这样为深拷贝,按值拷贝为浅拷贝!