8. 构造函数的初始化列表

在 C++ 语言定义的类中,通常一个类内有多个成员变量。在一个类创建对象时,先分配对象总体占用的内存,然后在调用对象各个成员的构造函数来初始化成员变量自身,然后才是调用该类的构造函数。如下面定义 Person 这个类,他有三个成员变量 nameage

class Person {
    private:
        string name; // 姓名
        int age; // 年龄
};

在使用 Person 创建对象时,会先调用 nameage 的构造函数,然后才会调用 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) 构造函数,但是在构造函数内又实用赋值语句将 nameage 的值进行了修改。这样的做法虽然可行,但可能会影响效率。

那如何能在 创建 nameage 时能够直接调用有参的构造函数将形参 na 的值直接用来创建成员变量呢?我们可以使用 C++ 语法中的 构造函数的初始化列表 来实现这一功能。

语法

在构造函数形参列表的右小括号 ()) 和 左大括号({)加一个冒号(:),冒号后显式调用成员变量的构造函数。

class 类名:
{
    public:
        类名(形参列表1) : 构造函数的初始化列表 {...}
        类名(形参列表2) : 构造函数的初始化列表 {...}
        ...
};

说明

  1. 构造函数的初始化列表如果有多个成员变量需要使用逗号(,)分隔。

示例

class Person {
    public:
        Person(): name(""), age(1) { }
        Person(const string &n, int a): name(n), age(a) { }
    private:
        string name; // 姓名
        int age; // 年龄
};

这样 nameage 会在创建时使用 na 来构建自己,之后则不需要修改自己的值。

实验

使用上述 Person 类来创建对象,然后添加成员函数并调用成员函数来打印成员变量的值。