(извините, если раньше об этом спрашивали; функция поиска, похоже, не работает: область результатов полностью пуста, хотя в ней указано несколько страниц результатов ... в 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) {} };