1、构造函数
特征:
1)与类名同名。
2)无函数返回类型说明。
3)主要是完成对象的初始化。
4)当一个新的对象被建立时(a.在对象的说明语句中 b.用new函数新建一个动态对象时),系统自动调用其相应的构造函数。
5)可有多个构造函数(重载):多个构造函数的函数名相同,但是其形参在数据类型或数量上有差异,系统会根据参数的性质和个数来选择合适的构造函数。
6)构造函数一定是公有函数。
7)构造函数的执行是在系统创建对象时自动执行的。
定义构造函数的一般形式为:
class 类名
{
public:
类名(形参列表);//构造函数原型
其他成员
};
类名::类名(形参表)
{
函数体
}
默认的构造函数:
若某个类定义中未给出显式的构造函数,则系统自动给出一个默认的构造函数:
<类名> (void)
{
}
若类定义了构造函数,则系统不提供默认的构造函数,此时,若还想要一个无参数的构造函数,则需用户另行定义。
当构造函数的参数具有默认值时,称为具有缺省参数的构造函数。使用默认值时需注意:
1)只能出现在类定义的接口部分,而不能出现在类定义的实现部分。
2)所有具有默认值的参数必须处在参数表的最右边。
3) 在使用具有缺省参数的构造函数时,要防止二义性。
1 class sample 2 3 { private: 4 5 int x,y,z; 6 7 public: 8 9 sample();//类sample的构造函数 10 11 sample(int i, int j, int k=10); //构造函数的重载,默认值只能出现在此处定义部分,而不能出现在下面的实现部分(第19行),且由于k有默认值,i,j没有,故k必须 位于i,j右侧 12 13 }; 14 15 sample:: sample() 16 17 { x=1; y=2;z=5; } 18 19 sample:: sample(int i, int j, int k) 20 21 { x=i;y=j;z=k; } 22 23 void main() 24 25 { 26 27 sample x(20,30,80); 28 29 sample y; //产生二义性 30 31 }
2、析构函数
特征:
1)函数名为:~类名。
2)无函数返回类型说明且无参数,不能随意调用,没有重载。
3)完成对象撤销前的善后工作。
4)当对象退出其说明区域,或使用delete释放动态对象时,系统自动调用其析构函数。如果用户未定义析构函数,则系统会生成和调用一个默认的析构函数。
5)一个类只有一个析构函数,也可缺省。
6)对象被析构的顺序与其建立的顺序正好相反。
7)当在构造函数中用new运算符为类的数据成员动态分配内存时,则相应地在析构函数中必须用delete运算符释放该内存。