我正在使用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;
}
我怎样才能做到这一点?
答案 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;
}
应该有用。