Я узнал, что мы можем дать конструктору параметры по умолчанию, чтобы он инициализировал значения, если они явно не указаны в коде, но когда я пытаюсь создать объект моего класса, он не работает. Он не принимает значения по умолчанию, если они не предоставлены, и выдает ошибку, которая говорит:
error: no matching function for call to ‘Person::Person(const char [6], int)
Person::Person( string aName = "ANY", int age = 18 ) {
cout << "Constructor called!" << endl;
this->name = aName;
this->age = age;
}
Теперь, когда я называю это в моем основном:
Person p( "Steve" );
Это дает мне упомянутую ошибку и age
по умолчанию не инициализируется до 18.
Я использую Eclipse для C / C ++ IDE
Значения по умолчанию для параметров должны указываться в объявлении, а не в определении:
class C {
C(int a = 0);
}
C::C(int a) // not C::C(int a = 0)
{ ... }
Как уже упоминал Эвг:
значения по умолчанию для параметров должны указываться в объявлении, а не в
определение
Кроме того, я хотел бы отметить, что обычно предпочитается использовать «список инициализатора» в вашем конструкторе (не путать с std :: initializer_list), который выглядит примерно так:
#include <string>
#include <iostream>
class Person
{
public:
Person(std::string aName = "ANY", int age = 18) : name(aName), age(age)
{
std::cout << "Constructor called!" << std::endl;
}
std::string name;
int age;
};
int main()
{
Person p1("Test123");
std::cout << p1.name << ' ' << p1.age << std::endl;
Person p2("Test456", 21);
std::cout << p2.name << ' ' << p2.age << std::endl;
return 0;
}
Таким образом, ваши переменные инициализируются ровно один раз, и это намного чище. Увидеть https://en.cppreference.com/w/cpp/language/initializer_list. В вашем примере name
а также age
будет инициализироваться по умолчанию (даже перед выполнением тела вашего конструктора) и назначаться, когда вы также можете немедленно инициализировать его с правильным значением.