当前位置:嗨网首页>书籍在线阅读

16-构造函数和析构函数小结

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

10.3.6 构造函数和析构函数小结

介绍一些构造函数和析构函数的例子后,您可能想停下来,整理一下学到的知识。为此,下面对这些方法进行总结。

构造函数是一种特殊的类成员函数,在创建类对象时被调用。构造函数的名称和类名相同,但通过函数重载,可以创建多个同名的构造函数,条件是每个函数的特征标(参数列表)都不同。另外,构造函数没有声明类型。通常,构造函数用于初始化类对象的成员,初始化应与构造函数的参数列表匹配。例如,假设Bozo类的构造函数的原型如下:

Bozo(const char * fname, const char * lname); // constructor prototype

则可以使用它来初始化新对象:

Bozo bozetta = Bozo("Bozetta", "Biggens");    // primary form
Bozo fufu("Fufu", "O’Dweeb");                 // short form
Bozo *pc = new Bozo("Popo", "Le Peu");        // dynamic object

如果编译器支持C++11,则可使用列表初始化:

Bozo bozetta = {"Bozetta", "Biggens"};   // C++11
Bozo fufu{"Fufu", "O’Dweeb"}             // C++11;
Bozo *pc = new Bozo{"Popo", "Le Peu"};   // C++11

如果构造函数只有一个参数,则将对象初始化为一个与参数的类型相同的值时,该构造函数将被调用。例如,假设有这样一个构造函数原型:

Bozo(int age);

则可以使用下面的任何一种形式来初始化对象:

Bozo dribble = Bozo(44); // primary form
Bozo roon(66);           // secondary form
Bozo tubby = 32;         // special form for one-argument constructors

实际上,第三个示例是新内容,不属于复习内容,但现在正是介绍它的好时机。第11章将介绍一种关闭这项特性的方式,因为它可能带来令人不愉快的意外。

警告: 接受一个参数的构造函数允许使用赋值语法将对象初始化为一个值:

Classname object = value;

这种特性可能导致问题,但正如第11章将介绍的,可关闭这项特性。

默认构造函数没有参数,因此如果创建对象时没有进行显式地初始化,则将调用默认构造函数。如果程序中没有提供任何构造函数,则编译器会为程序定义一个默认构造函数;否则,必须自己提供默认构造函数。默认构造函数可以没有任何参数;如果有,则必须给所有参数都提供默认值:

Bozo();                               // default constructor prototype
Bistro(const char * s = "Chez Zero"); // default for Bistro class

对于未被初始化的对象,程序将使用默认构造函数来创建:

Bozo bubi;           // use default
Bozo *pb = new Bozo; // use default

就像对象被创建时程序将调用构造函数一样,当对象被删除时,程序将调用析构函数。每个类都只能有一个析构函数。析构函数没有返回类型(连void都没有),也没有参数,其名称为类名称前加上~。例如,Bozo类的析构函数的原型如下:

~Bozo(); // class destructor

如果构造函数使用了new,则必须提供使用delete的析构函数。