一、构造函数与析构函数
1.构造函数的作用:初始化对象的数据成员。在类对象被创建时,编译系统为对象分配内存空间,并自动调用构造函数,由构造函数完成成员的初始化操作。
- 构造函数特征:
- 函数名与类名相同
- 构造函数无返回类型说明,什么也不写,也不可写void
- 在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象的生命期内也只调用这一次
- 构造函数可以重载,即说明中可以有多个构造函数。它们由不同的参数列表区分,系统在自动调用时一般按照函数重载的规则选择一个执行。
- 构造函数可以在类内定义也可以在类外定义。一般选择在类外定义,可以考虑使用inline内联函数
- 如果类说明中没有给出构造函数,则C++编译器自动给出一个默认的构造函数
2.构造函数的调用:
- 构造函数:
1 CGoods(char*name,int amount,float price) 2 { 3 strcpy(Name,name); 4 Amount=amount; 5 Price=price; 6 Total_value=price*amount; 7 }//CGoods的构造函数 8 9 //构造函数的调用 10 CGoods Car1("夏利200",30,98000.0); 11 调用上边的构造函数,等价于: 12 CGoods Car1=CGoods("夏利200",30,98000.0);
3.析构函数的作用:当一个对象的生命期结束时,C++会自动调用析构函数对该对象进行善后工作
- 析构函数的特征:
- 析构函数名与类名相同,但在前面加上~,如~CGoods()
- 析构函数无返回值类型,析构函数不带任何参数
- 一个类有一个且只有一个析构函数,这一构造函数不同。析构函数可以默认。
- 对象注销时,系统自动调用析构函数。
二、含有成员对象的构造函数与析构函数
1.类的成员中,除了成员数据和成员函数外,还有成员对象,即用其他类的对象作为类的对象。使用成员对象的技术成为聚合。成员对象时实体,系统不仅为它分配内存,而且还要进行初始化。
2.含有对象成员的构造函数:
- 格式:---------类名::构造函数名(参数总表):对象成员1(参数列表1),对象成员2(参数列表2){......}
- 含有对象成员的类对象初始化时,首先依次自动调用各成员对象的构造函数,再执行该类对象自己的构造函数的函数体部分。各成员对象的构造函数的调用顺序与类定义中的说明顺序一致,而与它们在构造函数成员初始化列表中的顺序无关。
-
1 class date 2 { 3 int year,month,day; 4 date(int y,int m,int d) 5 { 6 year=y; 7 month=m; 8 day=d; 9 } 10 } 11 12 class person 13 { 14 char name[12]; 15 char sex[4]; 16 date bitrhday; 17 public: 18 person(char*,char*,int,int,int); 19 ...... 20 21 } 22 23 person::person(char*n,char*s,int y,int m,int d):birthday(y,m,d) 24 { 25 strcpy(name,n); 26 strcpy(sex,n); 27 }
//这里的birthday(y,m,d)不能写成date(y,m,d)
若一个类包含对象成员,在建立该类的对象时,先调用对象成员的构造函数,初始化相应的对象成员,再执行该类的构造函数
3.含有成员对象的析构函数
因为析构函数没有参数,所以包含成员对象的类的析构函数形式上并无特殊之处。但在撤销该类对象的时候,会首先调用自己的析构函数,再调用成员对象的析构函数,调用次序与初始化时的次序相反。