我目前在“编程:使用C ++的原理和实践”(第2版,第3版)的第6章中遇到麻烦。
根据书的索引,在第184页上有一个成员初始化列表的示例。
第184页的内容如下:
“”在这里,我们只提供两个成员函数,为我们提供一种更方便的初始化令牌的方法:
class Token {
public:
char kind; // what kind of token
double value; // for numbers: a value
};
我们现在可以初始化(“构造”)令牌对象。例如:
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答案(What is this weird colon-member (" : ") syntax in the constructor?),我认为成员初始化器列表看起来更像:
Name_value(string n, int v)
:name(n), value(v) { }
(由Chrinkus在Github上的以下代码中找到: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)
{}
这些是成员初始值设定项,不是吗?我想知道作者在写“这儿,我们将只提供两个成员函数,以便为我们提供一种更方便的初始化令牌的方法”时是否要引用这两个函数的方法:]
我的简短回答:“关于结构,类,成员和构造函数,您将在本书的后面找到。”
((通常,本书不建议我开始学习c ++,对于初学者来说,我最喜欢的是Alex Allain的C ++入门,因为他在哈佛上过c ++入门课程,并且真的知道初学者想要/需要知道的东西。以正确的顺序)
将您的问题放在正确的环境中:
有许多方法可以用C ++代码表示这个想法。这是我们认为最有用的最简单方法:
class Token {
// a very simple user-defined type
public:
char kind;
double value;
};
我们现在可以初始化(“构造”)令牌对象。例如:
Token t1 {'+'};
Token t2 {'8',11.5};
// initialize t1 so that t1.kind = ‘+’
// initialize t2 so that t2.kind = ‘8’ and t2.value = 11.5
我认为我误解的可能性比发生错误的可能性大得多。这本书上有错字,但尽管如此,我还是在找本书的这一部分令人困惑。感谢您提供的任何反馈意见。
是的,你是对的,你弄错了,这本书令人困惑:)
我更长的答案:在本书的这一点上,您还不了解许多std c ++概念,而为Bjarne编写本书的人“他们”并不是试图教您类或结构,而是指出...
...一种语言无法提供成千上万种类型:谁会定义它们,实施它们的人,如何找到它们,以及手册必须厚多少?像大多数现代语言一样,C ++通过让我们定义自己的类型(用户定义类型)何时需要它们。
就这些。
在c ++ class
中,您可以做很多很酷的事情,例如使用class
的构造函数初始化变量,就像您在答案中引用的那样。
当您调用class
本身时,您有机会在“类构造函数”调用中直接初始化(“ construct”)] >>您的“ class
变量”。
看起来您的示例中调用了类Name_value
:
。Name_value(string n, int v) :name(n), value(v) { }
调用
class
本身意味着:这是“ a构造函数”
不要与“ initialize(” construct“)]
混淆class
中的内容。书中缺少的-使用您的代码-类似于:由c ++ /编译器为您创建。class Token { public: char kind; //what kind of token double value; //for numbers: a value void initialize() { 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 } };
此代码也是有效的,因为constructor
我希望这可以帮助您在书中走得更远,并为您澄清一些。尽管如此,我还是强烈建议您从另一本对初学者更友好的书开始,以避免重大的挫败感,并取得许多小的胜利,以克服潜在的真正不必要和可避免的挫败感。
我对这本书的2美分:
这本书适合以前从未编程过但愿意努力学习。第32页
正在错过领导。
到目前为止,我们已经教过成千上万的一年级学生使用德克萨斯农工大学的这本书,大约60%在此之前,大约40%的人从未在他们的生活中见过代码。大多数成功,所以您也可以做到。第35页
我的估计值是:在这本书的60%的帮助下,40%几乎不会成功,但仅这本书,很可能40%不会成功。
*我和大多数c ++编程书籍所遇到的问题是,它们使我/我们开始感到愚蠢-而您却不是! -,因为作者无法正确教授该语言。 *
有几个很好的教学例外,我在c ++书籍中花了很多钱得出这个结论,以我的观点/经验来看,这并没有使初学者感到愚蠢,但实际上每个人都在尝试相反的做法。成为初学者的书应该:帮助您获得编程乐趣!跳转到c ++是其中之一。
如果您在读完一本针对c ++的优秀入门书面书籍后阅读了本书,您的问题和许多其他问题证明我正确,那么本书将变得更有帮助,并且更具意义。
我通过电子邮件与Bjarne取得联系,他迅速通知我这是一个错误,该错误将在下一次印刷中修复。因此,我的猜测是第184页的内容或多或少如下: