我目前正在研究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) { }
};
谢谢。
答案 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);
此行代码将创建Token
类t
的实例,其中t.kind
等于'a',而t.value
等于0。
为什么要使用它们?您可以编写一个可以完成相同任务的常规构造函数,例如:
Token(char ch) {
kind = ch;
value = 0;
}
Token(char ch, double val) {
kind = ch;
value = val;
}
构造成员初始化器列表只是完成完全相同的事情的更简洁的方法。