【发布时间】:2011-01-20 01:55:23
【问题描述】:
(很抱歉,如果之前有人问过这个问题;搜索功能似乎被破坏了:结果区域完全空白,即使它说有几页结果……在 Chrome、FireFox、和 Safari)
所以,我只是在学习 C++……而我正在阅读的这本书在以我可以掌握的方式解释构造函数方面做得真的很糟糕。到目前为止,我已经大致了解了其他所有内容,但我无法弄清楚构造函数的语法实际上是如何工作的。
例如,我被告知以下将导致构造函数调用指定超类的构造函数:
class something : something_else {
something(int foo, double bar) : something_else(int foo) {}
};
另一方面,本书后面在描述如何初始化const成员时使用了相同的语法:
class something : something_else {
private: const int constant_member;
public: something(int foo, double bar) : constant_member(42) {}
};
那么……呃……那里到底发生了什么? rv signature(param) : something_else(what); 的语法实际上是什么意思?我无法弄清楚 something_else(what) 是什么,与它周围的代码有关。它似乎具有多种含义;我确信它对应的语言中一定有一些底层元素,我只是想不通什么。
编辑:另外,我应该提一下,前面例子中的what 有时是一个参数列表(所以something_else(what) 看起来像一个函数签名)......有时是一个常量值表达式(所以something_else(what) 看起来像一个函数调用)。
现在,继续:多重继承和构造函数呢?如何指定调用哪些父类的构造函数……以及默认调用哪些构造函数?我知道,默认情况下,以下两个是相同的……但我不确定涉及多重继承时的等价物是什么:
class something : something_else {
//something(int foo, double bar) : something_else() {}
something(int foo, double bar) {}
};
非常感谢您对探索这些主题的任何帮助;我不喜欢这种我无法理解基本知识的感觉。我不喜欢它一点。
编辑 2: 好的,到目前为止,下面的答案都非常有帮助。不过,他们提出了这个问题的另一个部分:“初始化列表”中基类构造函数调用的参数与您定义的构造函数有何关系?它们是否必须匹配……是否必须有默认值?他们必须匹配多少?换句话说,以下哪些是非法的:
class something_else {
something_else(int foo, double bar = 0.0) {}
something_else(double gaz) {}
};
class something : something_else {
something(int foo, double bar) : something_else(int foo, double bar) {} };
class something : something_else {
something(int foo) : something_else(int foo, double bar) {} };
class something : something_else {
something(double bar, int foo) : something_else(double gaz) {} };
【问题讨论】:
-
你在读哪本书?
void something()...完全错误。 -
对不起,我仍然坚持使用 C 的语法。这些都不是直接从书中复制的,因此我认为我做错了一些事情。 (另外,我认为 void 是合法的,但没有必要……\一些编译器会吐出来,不过,我认为……所以我确定它是错误的形式。)
-
哦,这本书是 Practical C++ Programming,作者 Steve Oualline
-
C++ 足够复杂,第一次学习。我知道如果你已经花时间在一本书上会很痛苦——但相信我,你会读得更多。所以让自己更轻松,从一本好书开始。我建议从 Accelerated C++ 开始。
-
请注意,您总是弄错:它是
something(int foo, double bar) : something_else( /*int*/foo, /*int*/bar )。初始化列表中的元素是对构造函数的调用。
标签: c++ inheritance constructor class multiple-inheritance