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

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

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

在使用 Person 创建对象时,会先调用 name、age 的构造函数,然后才会调用 Person 的构造函数。

例如

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

在使用 Person 类创建对象时如下所示:

Person p1("魏明择", 35);

上述在创建 p1 对象时是先调用 无参数的 std::string(void) 构造函数来创建 name 成员变量,再调用无参数的 int(void) 构造函数来创建 age 成员变量,然后才调用 Person(const std::string &n, int a) 构造函数,但是在构造函数内又实用赋值语句将 name 和 age 的值进行了修改。这样的做法虽然可行,但可能会影响效率。

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

语法

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

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

说明

示例

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

这样 name 和 age 会在创建时使用 n 和 a 来构建自己,之后则不需要修改自己的值。

实验

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