c++中类的默认构造函数,析构函数,拷贝构造函数

来源:互联网 发布:代理软件有哪些 编辑:程序博客网 时间:2024/05/24 16:13

1.默认构造函数

如果没有显示的为类声明构造函数,编译器将生成一个不接受任何参数,也不执行任何操作的默认构造函数。然而你可以创建自己的默认构造函数,它可以不接受任何参数,但根据需要对对象进行设置。

编译器提供的构造函数被称为默认构造函数,但按照惯例,任何可以不接受参数的构造函数都是默认构造函数如果你创建了任何构造函数,编译器不会提供构造函数。因此,如果需要一个可以不接受任何参数的构造函数,且已经创建了其他构造函数,则必须自己添加默认构造函数

编译器提供的默认构造函数不会为数据成员提供初始值,也就是不会把数据成员初始化为0或者NULL。

2. 析构函数

析构函数在对象被销毁后完成清理工作并释放(在构造函数或对象的生命周期中)分配的资源或内存。析构函数总是与类同名,但在前面加上一个~。析构函数没有参数也没有返回值,所以一个类只能有一个析构函数。

3. 默认拷贝构造函数

除提供默认构造函数和析构函数外,编译器还提供一个默认拷贝构造函数。每当创建对象的拷贝时,都将调用拷贝构造函数。

所有拷贝构造函数都接受一个参数:指向其所属类的对象的引用。将该引用声明为const是个好主意,因为拷贝构造函数不会修改传入的对象。例如:

cat(const cat & cat);

cat构造函数接受一个指向cat对象的const引用。该赋值构造函数旨在创建一个thecat拷贝。

默认拷贝构造函数将作为参数传入的对象的每个成员变量复制到新对象的成员变量中。这被称为成员拷贝(浅拷贝),这虽然对大多数成员变量来说是可行的,但对于指向自由存储区中的对象的指针成员变量不可行。

成员浅拷贝只是将对象成员变量的值复制到另一个对象中,两个对象中的指针最后将指向同一个内存块。深拷贝将在堆中分配的值复制到新分配的内存中

如果cat类中包含一个成员变量*itsage,它是一个指向自由存储区中的int变量指针,默认拷贝构造函数将传入的cat对象的itsage成员变量的值,拷贝到新的cat对象的itsage成员变量中。这两个成员变量指向同一个内存块。当其中任何一个cat对象不再在作用域中时,浙江导致灾难性后果。如果原始的cat对象的析构函数释放了这块内存,而新的cat对象仍指向该内存块,将生成一个迷途指针,程序将处于致命的危险之中。

解决这种问题的方法是,创建自己的拷贝构造函数并根据需要分配内存。分配内存后,便可以将原来的值复制到新内存中,这被称为深拷贝。

相关阅读:http://blog.csdn.net/beyond_cn/article/details/9898687


转自http://www.cnblogs.com/songQQ/archive/2009/11/02/1594852.html