8. 构造函数的初始化列表
在 C++ 语言定义的类中,通常一个类内有多个成员变量。在一个类创建对象时,先分配对象总体占用的内存,然后在调用对象各个成员的构造函数来初始化成员变量自身,然后才是调用该类的构造函数。如下面定义 Person 这个类,他有三个成员变量 name、age。
class Person {
private:
string name; // 姓名
int age; // 年龄
};
在使用 Person 创建对象时,会先调用 name、age 的构造函数,然后才会调用 Person 的构造函数。
例如
class Person {
public:
Person(const string &n, int a) {
name = n;
age = a;
}
private:
string name; // 姓名
int age; // 年龄
};
在使用 Person 类创建对象时如下所示:
Person p1("魏明择", 35);
上述在创建 p1 对象时是先调用 无参数的 string(void) 构造函数来创建 name 成员变量,再调用无参数的 int(void) 构造函数来创建 age 成员变量,然后才调用 Person(const string &n, int a) 构造函数,但是在构造函数内又实用赋值语句将 name 和 age 的值进行了修改。这样的做法虽然可行,但可能会影响效率。
那如何能在 创建 name 和 age 时能够直接调用有参的构造函数将形参 n 和 a 的值直接用来创建成员变量呢?我们可以使用 C++ 语法中的 构造函数的初始化列表 来实现这一功能。
语法
在构造函数形参列表的右小括号 ()) 和 左大括号({)加一个冒号(:),冒号后显式调用成员变量的构造函数。
class 类名:
{
public:
类名(形参列表1) : 构造函数的初始化列表 {...}
类名(形参列表2) : 构造函数的初始化列表 {...}
...
};
说明
- 构造函数的初始化列表如果有多个成员变量需要使用逗号(
,)分隔。
示例
class Person {
public:
Person(): name(""), age(1) { }
Person(const string &n, int a): name(n), age(a) { }
private:
string name; // 姓名
int age; // 年龄
};
这样 name 和 age 会在创建时使用 n 和 a 来构建自己,之后则不需要修改自己的值。
实验
使用上述 Person 类来创建对象,然后添加成员函数并调用成员函数来打印成员变量的值。