析构函数、复制构造函数、赋值函数什么时候必须显式定义

当类的构造函数中动态申请了内存的话,如果new 出该类的一个对象,当你delete对象的时候,只能释放掉该类中的其他成员变量,而动态申请的内存空间就无法释放了,这样就会导致内存泄露。所以在构造函数中动态申请了内存的话,那么就一定要在析构函数中用delete运算符来释放申请的内存。

另外,我们知道,如果不显示定义类的复制构造函数、赋值函数的时候,类会产生默认的复制构造函数、赋值函数,而这些默认的函数,只是一种“浅”赋值、“浅”复制。说他们“浅”,是因为他们只是简单的进行赋值和复制,而这样可能会导致这样一种问题。
比如,类的对象A里面有个指针成员变量p,指向一片动态申请的内存区域,当进行对象复制的时候,对象B里面的指针变量将会得到和A里的指针一样的地址值,即他们指向同一块区域。这时如果,对象A中指针p指向的内存空间被释放,那么对象B中的指针指向的位置也一同被释放(因为他们指向同一片内存空间),所以程序就会出错。同理赋值函数也是一样的道理。

这时就该显示的定义类的复制构造函数,赋值操作符,进行深赋值、深复制,来避免上面的问题。

你可能感兴趣的:(C++语法)