本文共 1735 字,大约阅读时间需要 5 分钟。
构造函数和析构函数
构造函数和析构函数是类的两个特殊成员函数。构造函数与复制构造函数
一个对象的数据成员反映了对象的属性,它们的值描述了对象所处的状态。但在类的定义中,无法用表达式初始化这些数据成员,因而在说明一个对象时,其初始状态是不稳定的。在创建对象时,应对该对象进行初始化。C++语言在创建一个对象时,通过系统自动调用构造函数对所创建的对象进行初始化。对象(数据成员)的初值通过自动调用构造函数取得,也可以通过赋值或调用已有的陈谷原函数来改变它。构造函数的特点:
构造函数是一种成员函数。它不仅具有陈冠函数的特性,还有其自身的特点。构造函数的特点如下: 1)该函数的名字与类名相同。 2)构造函数无返回值,因此不许定义构造函数的返回值类型,其中包括void类型。 3)该函数可以有一个或多个参数,页可以无参数。无参数的构造函数称为默认构造函数。 4)该函数通常在创建对象时系统自动调用。如果类内没有定义构造函数,系统会自动定义默认的构造函数。 5)一个类可以由多个构造函数,重载构造函数尤其参数个数、类型及排列顺序进行区分。例如:
point(void) {X=0.0; Y=0.0;} //无参构造函数point(float x, float y) {X=x; Y=y;} //两个参数的构造函数
构造函数的设计及应用
一般情况下,在说明类中的私有数据成员时不初始化其值,需要在定义(创建)对象时正式初始化,以确认对象的有效性。采取显示调用或尘缘函数进行对象初始化容易发生遗漏,因此采用由系统自动调用构造函数可以避免这种情况。当一个类的不同对象需要不同的初始化时,要由不同的构造函数来完成;一种是不带参数的构造函数称为默认的构造函数;另一种是带参数的构造函数。 (1)默认构造函数<函数名> () { <函数体> } 函数体> 函数名>
其中函数名与类名相同。默认构造函数有两种,一种是系统自动提供的,当定义一个类且类体内没有定义任何构造函数时,系统将提供默认构造函数,函数体为空。它用来给创建的对象初始化,使对象中的不同类型的数据成员具有默认值或无意义值。另一种是用户定义的不带参数的构造函数,这种默认构造函数的函数体可以根据需要定义一些内容。
(2)参数化的构造函数
当创建一个对象时,常需要通过传递一定的数据来对其中的某些数据初始化,实现这一点,需要带参数的构造函数来完成,在定义对象时通过不同参数值的传递,来实现对不同对象的不同初始化。 在定义构造函数时,可以给函数参数指定默认值。在函数调用者不确定参数时,被定义的的默认值可以作为默认参数值来用。复制构造函数
复制构造函数是一种特殊的构造函数——只有一个参数,并且参数是该类对象的引用。其主要功能就是在初始化时被调用,以便将一个一直对象的数据成员的值复制给正在创建的另外一个同类的对象。*例如,当函数返回一个对象或用一个对象初始化另一个对象时,都调用该复制构造函数。* 复制构造函数的定义格式如下:<构造函数名> ( <类名> & <引用名> ) { <函数体> } 函数体> 引用名> 类名> 构造函数名>
其中,函数名与该类的类名相同,该函数的参数是该类对象的引用,并且只有一个参数。
析构函数
析构函数也是一种特殊的成员函数,其功能是用来释放所创建的对象,主要用来完成对象被删除前的一些清理工作。例如,一个窗口对象在撤销时,需要恢复屏幕上原先被覆盖的内容,并释放由构造函数分配的内存等。析构函数在对象的生存期即将结束时由系统自动调用。 析构函数的名字与类名相同,与构造函数的区别是名字前加一个符号“~”,表明他与构造函数的功能相反。析构函数也没有函数返回类型。 其定义格式如下;~ <函数名> { <函数体> } 函数体> 函数名>
其中,函数名与类名相同。如果一个类中没有定义析构函数,系统会自动生成一个默认析构函数,函数体为空。析构函数一般为公有函数,其函数体可以在类体内定义,也可以在类体外定义。一个类只有一个析构函数,析构函数没有参数,不能重载,定义析构函数时不必给出函数返回类型。
先创建的对象后析构,后创建的对象先析构。(先进后出)
转载地址:http://wvxii.baihongyu.com/