【发布时间】:2010-09-16 07:16:12
【问题描述】:
拥有一个使用默认参数的类构造函数是一种好习惯,还是应该使用单独的重载构造函数?例如:
// Use this...
class foo
{
private:
std::string name_;
unsigned int age_;
public:
foo(const std::string& name = "", const unsigned int age = 0) :
name_(name),
age_(age)
{
...
}
};
// Or this?
class foo
{
private:
std::string name_;
unsigned int age_;
public:
foo() :
name_(""),
age_(0)
{
}
foo(const std::string& name, const unsigned int age) :
name_(name),
age_(age)
{
...
}
};
任何一个版本似乎都可以工作,例如:
foo f1;
foo f2("Name", 30);
您喜欢或推荐哪种风格,为什么?
【问题讨论】:
-
我个人在很多项目中都大量使用了它。至于是不是“最好的”,我说不上来,但过去肯定对我非常有帮助。
-
无论哪种方式都没什么大不了的。然而,一个警告是,任何只接受一个参数的构造函数都应该是显式的,以避免讨厌的隐式转换。
-
这两种方法都可以,只要你不混合使用它们 - 否则你可能会得到一些令人讨厌的惊喜。
-
您的第二个选项有效吗?在我看来这是错误的。您正在重载构造函数,因此您应该声明两个函数 foo() 和 foo(string, unsigned)... 然后您将拥有第一个选项。
-
C++ 指南在这个主题上很明确:这两个选项都没有,但第二个更好。制作几个重载的构造函数和prefer in-class initializers。
标签: c++ constructor coding-style overloading