Аргументы по умолчанию должны быть указаны в объявлении, а не в реализации. Кроме того, вы должны взять строку по значению, а не по ссылке, и переместить ее в MyClass::c
член:
public:
MyClass(int a, int b, std::string c = "uninstantialised");
// ...
MyClass::MyClass(int a, int b, std::string c)
: a(a), b(b), c(std::move(c))
{ }
Взятие по значению и использование std::move()
не требуется, но рекомендуется, поскольку это может быть более эффективным, поскольку в некоторых случаях позволяет избежать копирования строки.
Я рекомендую переименовать личные элементы данных во что-то, что не позволяет использовать то же имя для чего-то другого. Здесь c
является как закрытым членом, так и параметром конструктора. Вы должны использовать что-то другое для участников. Например, a_
, b_
и c_
. Добавление подчеркивания - это популярный способ присвоения имен частным членам данных.