具有一个默认参数的构造函数

Constructor with one default argument

本文关键字:构造函数 参数 默认 有一个 具有一      更新时间:2023-10-16

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

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

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

Person two("Smythecraft");

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

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

第三人("迪姆威迪"、"山姆");

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

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

我怎样才能做到这一点?

在你的标题中:

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 )
{
}
如果默认参数

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

此外,如果可能,您应该更喜欢使用成员初始化列表。本页的第一篇文章引用了Scott Meyers关于使用成员初始化列表的优势。

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

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

// in class
Person(const string & ln, const char * fn = "Heyyou");
// later
Person::Person(const std::string &ln, const char * fn) { ... }

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

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

应该工作。