对构造函数和析构函数的初步理解

为了理解构造函数和析构函数,先说明一下同一个类的对象之间的不同之处:首先,对象名不相同。其次,对象的数据成员的值不相同。我们在声明一个对象时,可以对其初始化。如果对其初始化,那么程序会向操作系统申请为其分配一定的内存空间,在为其分配内存空间时,会将初始化写入内存单元中。问题是,我们不能像初始化一般变量那样,在对其初始化时,将初始值写入内存单元中,这是因为相对于这种初始化方法来说,类的对象太过复杂。

构造函数:我们用构造函数来初始化类的对象。C++在创建对象时,都会调用构造函数。构造函数是一种特殊的类成员函数,当然可以直接访问类的所有数据成员;可以是内联函数,可以有形参列表,可以有默认形参值,可以重载。

我们可以将一个变量的值,赋给同一类型的另一个变量,对于类的对象来说,也可以将一个对象的内容,拷贝给同一类的另一个对象。拷贝的方法可以是将一个对象的数据变量的值,分别赋给另一个对象的相应数据变量。但是如果数据变量很多,这种方法就显得有些麻烦。也可以用一种特殊的构造函数,来实现用一个已经存在的对象来初始化另一个对象这种功能。

拷贝构造函数:一种特殊的构造函数,也是用来构造对象的,具有构造函数的所有特性。拷贝构造函数能利用一个已存在的对象初始化同一类的另一个对象。拷贝构造函数的形参是本类的对象的引用。(为什么必须是引用?)

拷贝构造函数在以下三种情况下会被调用:当用类的一个对象初始化该类的另一个对象时,系统自动调用拷贝构造函数实现对象间的拷贝赋值;当某个函数的形参是某个类的对象时(可以是对象的引用吗?),当调用这个函数,实参赋值给形参时,系统就自动调用拷贝构造函数;当某个函数的返回值是某个类的对象时,调用拷贝构造函数。最后的一种情况:函数func的返回值是A,对象A是在函数func内部的局部变量,当函数func执行完之后就被释放。调用函数func的语句是:B=func()。对象B是这样被对象A赋值的:当编译器执行B=func()时,会创建一个临时无名变量。当func函数执行return A;语句之时,实际是调用拷贝构造函数,将对象A的值拷贝给那个临时变量,之后释放A占用的内存空间。之后再用拷贝构造函数,将临时变量的值拷贝到对象B中。

析构函数:自然万物都有生命周期,类的对象也不例外。如果在某一个函数中声明了一个对象,在函数执行结束,返回调用函数时,声明的对象就会被释放。析构函数的作用与构造函数的相反。析构函数是在对象要被删除时,系统自动调用的。执行完析构函数之后,对象占用的内存被释放。如果我们希望在删除对象时做一些相关的清理工作,就可以把它们写在该类的析构函数中。

posted @ 2012-08-15 18:13  congcongfiry  阅读(891)  评论(0编辑  收藏  举报