首页 > 解决方案 > 缺少成员初始值设定项列表的示例。184 的编程原理和使用 C++ 的实践,第 2 版

问题描述

我目前在“编程:使用 C++ 的原则和实践”(第 2 版,第 3 次印刷)的第 6 章的部分内容中遇到问题。

根据本书的索引,成员初始化器列表的示例在第 184 页。

第 184 页的部分内容如下:

“在这里,我们将只提供两个成员函数,为我们提供一种更方便的初始化 Token 的方法:

 class Token {
    public: 
    char kind; // what kind of token
    double value; // for numbers: a value
    };

我们现在可以初始化(“构造”)Token 对象。例如:

Token t1 {'+'}; // initialize t1 so that t1.kind = '+'
Token t2 {'8,' 11.5}; // initialize t2 so that t2.kind = '8' and t2.value = 11.5

"

这些代码集之一是索引所指示的成员初始值设定项列表的示例吗?我有点困惑,因为基于另一个 Stackoverflow 答案(构造函数中这个奇怪的冒号成员 (" : ") 语法是什么?),我认为成员初始化器列表看起来更像:

Name_value(string n, int v)
                :name(n), value(v) { }

(在 Github 上 Chrinkus 的以下代码中找到:https ://github.com/Chrinkus/stroustrup-ppp/blob/master/chapter06/ex04_Name_value.cpp )

class Name_value {
    public:
        string name;
        int value;
        Name_value(string n, int v)
            :name(n), value(v) { }
};

我认为我弄错的可能性远大于书中的错字,但尽管如此,我发现这本书的这一部分令人困惑。感谢您提供的任何反馈。

更新:我发现第 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)
    {}

那些是成员初始化器,不是吗?我想知道作者在写“这里,我们将只提供两个成员函数,为我们提供一种更方便的初始化 Tokens 的方式:”时是指这两个函数:

标签: c++listinitializationmemberinitializer

解决方案


我通过电子邮件联系了 Bjarne,他立即告诉我这是一个错误,将在下一次印刷中修复。所以我的猜测是,第 184 页的那部分内容大致如下:

“在这里,我们将只提供两个成员函数,为我们提供一种更方便的初始化 Token 的方法:

 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) { }

};

我们现在可以初始化(“构造”)令牌对象。. 。”

上面代码中的两个成员初始化器列表取自第 6 章练习的示例代码,可在此处获得:http: //www.stroustrup.com/Programming/calculator02buggy.cpp(请注意,此代码包含一些故意读者打算在练习中解决的错误。)

我希望这对其他对成员初始化列表感到困惑的人有用。到目前为止,这本书对我非常有用,我打算继续阅读它。


推荐阅读