具有一个默认参数的构造方法

时间:2013-09-08 12:48:38

标签: c++ constructor

我正在使用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;
}

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分: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 this page的第一篇文章引用了 Scott Meyers 关于使用 member-initialization-list 的优势。

答案 1 :(得分:0)

我会猜测你的问题,因为你提到了一个构造函数原型。

您无法在原型实现中指定默认参数。只需在原型中指定它们,并将实现保留为普通函数。像这样:

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

// later
Person::Person(const std::string &ln, const char * fn) { ... }

答案 2 :(得分:0)

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

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

应该有用。