понимание конструктора по умолчанию переполнение стека

class WithCC { // With copy-constructor
public:
// Explicit default constructor required:
WithCC() {}
WithCC(const WithCC&) {
cout << "WithCC(WithCC&)" << endl;
}
};

class WoCC { // Without copy-constructor
string id;
public:
WoCC(const string& ident = "") : id(ident) {}
void print(const string& msg = "") const {
if(msg.size() != 0) cout << msg << ": ";
cout << id << endl;
}
};

class Composite {
WithCC withcc; // Embedded objects
WoCC wocc;
public:
Composite() : wocc("Composite()") {}
void print(const string& msg = "") const {
wocc.print(msg);
}
};

Я читаю мышление в c ++ главе 11 по умолчанию конструктор копирования.
За приведенный выше код автор сказал: «Класс WoCC не имеет конструктора копирования, но его конструктор будет хранить сообщение во внутренней строке, которую можно распечатать, используя
print( ).Этот конструктор явно вызывается в Composite’s список инициализатора конструктора «.

Почему WoCC constrcutor должен быть явно вызван в Compositeконструктор?

0

Решение

Вы можете счастливо пропустить явную конструкцию, потому что wocc будет неявно построен по умолчанию. По умолчанию используется конструктор без аргументов. WoCC имеет конструктор по умолчанию, потому что конструктор, который принимает string имеет значение по умолчанию для этой строки.

Конструктор должен вызываться только явно, если вы хотите передать определенную строку, как это происходит в этом случае.

Однако, если аргумент не имеет значения по умолчанию (удалить = ""), тогда вам действительно придется явно вызвать правильный конструктор в Composose, Это потому, что определение любого из ваших собственных конструкторов не позволяет компилятору неявно генерировать конструктор по умолчанию по умолчанию. Если у него нет конструктора по умолчанию, вам нужно убедиться, что для wocc член.

Также, WoCC действительно имеет конструктор копирования. Компилятор генерирует неявный конструктор копирования, если вы его не определите (и он определяет его только как deleted, если вы предоставите конструктор перемещения).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector