复制构造函数是个非常微妙的函数,如果不能深刻理解它,可是会出现很多莫名奇妙的错误,下面通过一个程序来详细的介绍其中的奥妙。
1 c++中的隐士成员函数
(1)默认构造函数,如果没有定义
(2)复制构造函数,如果没有定义
(3)赋值操作符,如果没有定义
(4)默认析构函数,如果没有定义
(5)地址操作符,如果没有定义
2 重点讲一下复制构造函数
复制构造函数讲一个对象复制 到一个新建的对象中,也就是说,它用于初始化的过程中,而不是常规的赋值过程中。
className(const className &);
(1)复制构造函数的功能
逐个复制非静态成员,复制的是值。这就会导致一个问题,在对象中有指针时,只是复制的指针的地址,而没有复制实际的内容,这时,我们必须显示的定义复制构造函数来解决这个问题。
(2)复制构造函数并没有在构造函数中增加新建对象的个数,但是他却会调用析构函数,这就会导致你在构造函数中的计数不准确。
(3)就像(1)中提到的,它只是复制了指针的地址,因此,对象调用析构函数的时候,最先调用析构函数的那个对象释放了指针指向的空间,但是当其他对象再次调用析构函数的时候,还会去释放这段空间,这就导致了同一个空间被delete两次,同常表现为乱码。