这是什么样的说法? (第6章,使用C ++的原理和实践)

时间:2019-01-08 22:58:06

标签: c++ constructor initialization

我目前正在研究Stroustrup的《使用C ++的原理和实践》第6章中的计算器程序,我遇到了这句话,这在书中没有解释,我在网上找不到任何参考(更像是我没有知道要搜索什么。

Token(char ch)    // make a Token from a char
        :kind(ch), value(0) { }
Token(char ch, double val)     // make a Token from a char and a double
        :kind(ch), value(val) { }

我对此表示感谢。

这是完整的内容:

class Token {
public:
    char kind;        // what kind of token
    double value;     // for numbers: a value
    Token(char ch)    // make a Token from a char
        :kind(ch), value(0) { }
    Token(char ch, double val)     // make a Token from a char and a double
        :kind(ch), value(val) { }
};

谢谢。

2 个答案:

答案 0 :(得分:3)

它们被称为构造函数成员初始化器列表。

Token(char ch)   
    :kind(ch), value(0) { } // the initialization list starts after the colon

它们在构造函数进入函数主体之前初始化其成员。重要的是要注意,初始化顺序是由类中的声明顺序定义的:由于char kind是在int value之前声明的,因此kind必须首先在列表中初始化。不建议在初始化列表中使用其他顺序,因为这可能会导致将来的维护者感到困惑。

答案 1 :(得分:0)

正如其他用户已经提到的那样,这些是构造函数成员初始化器列表。它们可用于设置数据字段的特定值以及提供默认值。例如,您所包含的代码块中的第一个构造函数将Token实例的kind字段初始化为ch,并将value字段初始化为0。这是一个示例构造函数被调用:

char x = 'a';
Token t(x);

此行代码将创建Tokent的实例,其中t.kind等于'a',而t.value等于0。

为什么要使用它们?您可以编写一个可以完成相同任务的常规构造函数,例如:

Token(char ch) {
    kind = ch;
    value = 0;
}

Token(char ch, double val) {
    kind = ch; 
    value = val;
}

构造成员初始化器列表只是完成完全相同的事情的更简洁的方法。