c++ 构造函数 析构函数
·
构造函数的作用
调用构造函数是初始化对象的标准方法。 ——【初始化对象】
定义类时,不分配内存,也不初始化。在定义类类型时,给出所有对象统一的数据成员的初始值,是概念性的错误。
初始化只能在定义对象时进行。如何初始化数据成员?封装的目的出发,数据成员多为私有,必须用一个公有函数对它们进行初始化。该函数当且仅当定义对象时自动执行一次。
调用构造函数进行初始化是c++的标准方法
初始化对象,用构造函数是标准方法,即使不编写构造函数,c++编译器也会自动产生一个默认的构造函数,但是不进行具体的初始化,只是一个标准形式,c++中始终给构造函数留有位置。但只要定义了一个构造函数,系统就不再自动生成默认的构造函数了。
构造函数的特点
构造函数是特殊的公有成员函数,它的特点如下:
- 格式:
- 由于构造函数是隐式(自动)调用,所以得有一个固定格式,编译器才能识别出哪些函数是构造函数
- 函数名:与类名同名
- 返回类型:无,不进行说明(就是单纯不写,连void也不写)
- 新对象被建立时,该对象所属类的构造函数自动被调用,在对象生命周期中只调用这一次 【只在建立时调用一次】
- 可以重载,即类定义中可以有多个构造函数,由不同的参数表区分,系统调用时按函数重载规则选择一个执行
- 可在类中,也可在类外定义
- 类定义中没给出任何构造函数,则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++也会自动调用一个特殊的成员函数进行善后——析构函数。
析构函数的特点
- 函数名和类名相同,但前面加上字符 ~
- 无返回类型,也无参数
- 一个类有且只有一个析构函数(不像构造函数可以有多个,重载)
- 析构函数也可以默认
- 注销对象时,系统自动调用析构函数
更多推荐
所有评论(0)