0

我正在做一本 C++ 书并练习,我有这个构造函数原型:

Person(const string & ln; const char * fn = "Heyyou");

现在我必须以这种方式使用这个构造函数:

Person two("Smythecraft");

所以我应该将 lname(来自第一个参数的数据)设置为“Smythecraft”,并将 fname(来自第二个参数的数据)设置为“Heyyou”。

但这也应该适用于相同的构造函数:

第三个人(“Dimwiddy”,“Sam”);

我试过这个,但它不起作用。为什么?

Person::Person(const std::string &ln, const char * fn = "Heyyou")
{
    lname = ln;
    fname = fn;
}

我怎样才能做到这一点?

4

3 回答 3

3

在您的标题中:

class Person
{
public:
    // Declaration
    Person(const std::string &ln, const char * fn = "Heyyou");

    //...
};

在您的源文件中:

// Definition
Person::Person(const std::string &ln, const char * fn):
    lname( ln ),      // Prefer member-initialization-list
    fname( fn )
{
}

如果在声明中已经完成,则不允许在方法定义中指定默认参数。

此外,如果可能,您应该更喜欢使用member-initialization-list本页的第一篇文章引用了Scott Meyers关于使用member-initialization-list的优势。

于 2013-09-08T12:59:31.263 回答
0

我将猜测您的问题,因为您提到了构造函数原型。

您不能在原型实现中都指定默认参数。只需在原型中指定它们,然后像​​普通函数一样保留实现。像这样:

// in class
Person(const string & ln, const char * fn = "Heyyou");

// later
Person::Person(const std::string &ln, const char * fn) { ... }
于 2013-09-08T13:00:29.220 回答
0

您不需要在方法实现中指定与其声明分开的默认参数值,因为它已经在Person(const string & ln; const char * fn = "Heyyou");您的类中指定。这个:

Person::Person(const std::string &ln, const char * fn)
{
    lname = ln;
    fname = fn;
}

应该管用。

于 2013-09-08T13:00:29.813 回答