-1

我了解到我们可以为构造函数提供默认参数,以便它在代码中未明确提供时初始化值,但是当我尝试创建我的类的对象时,它不起作用。如果没有提供,它不会采用这些默认值,它给我一个错误,上面写着: 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;
}

现在当我在我的 main 中调用它时:

Person p( "Steve" );

它给了我提到的错误,并且age默认情况下不会初始化为 18。

我正在为 C/C++ IDE 使用 Eclipse

4

2 回答 2

4

参数的默认值应该进入声明,而不是定义:

class C {
    C(int a = 0);
}

C::C(int a)    // not C::C(int a = 0)
{ ... }
于 2018-12-11T14:15:34.440 回答
0

正如 Evg 已经提到的:

参数的默认值应该进入声明,而不是定义

另外我想指出,通常最好在构造函数中使用“初始化列表”(不要与 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将被默认初始化(甚至在您的构造函数主体执行之前)并分配给,当您也可以立即使用正确的值初始化它时。

于 2018-12-11T14:35:22.180 回答