构造函数的作用

调用构造函数是初始化对象的标准方法。 ——【初始化对象

定义类时,不分配内存,也不初始化。在定义类型时,给出所有对象统一的数据成员的初始值,是概念性的错误

初始化只能在定义对象时进行。如何初始化数据成员?封装的目的出发,数据成员多为私有,必须用一个公有函数对它们进行初始化。该函数当且仅当定义对象时自动执行一次
调用构造函数进行初始化是c++的标准方法

初始化对象,用构造函数是标准方法,即使不编写构造函数,c++编译器也会自动产生一个默认的构造函数,但是不进行具体的初始化,只是一个标准形式,c++中始终给构造函数留有位置。但只要定义了一个构造函数,系统就不再自动生成默认的构造函数了。

构造函数的特点

构造函数是特殊的公有成员函数,它的特点如下:

  1. 格式
  • 由于构造函数是隐式(自动)调用,所以得有一个固定格式,编译器才能识别出哪些函数是构造函数
    1. 函数名:与类名同名
    2. 返回类型:无,不进行说明(就是单纯不写,连void也不写)
  1. 对象建立时,该对象所属类的构造函数自动被调用,在对象生命周期中只调用这一次 【只在建立时调用一次】
  2. 可以重载,即类定义中可以有多个构造函数,由不同的参数表区分,系统调用时按函数重载规则选择一个执行
  3. 可在类中,也可在类外定义
  4. 类定义中没给出任何构造函数,则c++编译器自动给出默认的构造函数,但只是标准形式,不做具体的初始化工作
类名(void){} // 默认的构造函数——无参

初始化对象代码

// 定义书类
class Books{
	public:
		char Name[21];
		int Amount;
		float Price;
};

// 构造函数
Books(char name[], int amount, float price){
	strcpy(Name, name);
	Price = price;
	Amount = amount;
}

Books(char name[], float price){ // 也可以只用2个参数 ——重载
	strcpy(Name, name);
	Price = price;
	Amount = 0; // 避免随机数,出错
}

// 定义对象
Books Book1("红楼梦", 40, 100.0); // 调用Books中的第1个构造函数
// 相当于自动调用 构造函数:Books("红楼梦", 40, 100.0); 

Books Book2("西游记", 100.0); // 调用Books中的第2个构造函数,参数为2个

// 构造函数也可以显示表达:
Books Book1 = Books("红楼梦", 40, 100.0);
// 如果只有一个参数,可以简化,=后直接跟参数值

// 希望不带任何参数的初始化,可作如下定义
Books(){
	Name[0] = '\0';
	Price = 0.0;
	Amount = 0;
}

// 定义对象时,不能加括号
Books Book3, Book4(); // Book4()不是一个对象,而是一个不带参数的【函数】,它的【返回值是类Books的对象】

默认的构造函数可以由程序员来编,只要函数无参或各参数均有默认值,c++编译器都认为是默认的构造函数。
上面代码中最后定义的无参函数就是一个默认的构造函数。
尽管可以编写多个默认的构造函数,但如果其数量超过一个,系统会认为出错

析构函数的作用

定义对象时,c++会自动调用 构造函数 建立该对象并进行初始化,当一个对象生命周期结束时,c++也会自动调用一个特殊的成员函数进行善后——析构函数

析构函数的特点

  1. 函数名和类名相同,但前面加上字符 ~
  2. 无返回类型,也无参数
  3. 一个类有且只有一个析构函数(不像构造函数可以有多个,重载)
  4. 析构函数也可以默认
  5. 注销对象时,系统自动调用析构函数

更多推荐