在我的代码中我正在做以下事情,但我不确定我是否“被允许”或者它是否是一个好的设计技巧。我需要创建一个空构造函数,但我还需要一个构造函数来初始化给定参数的变量。所以我正在做以下事情:
这是C.h文件。
class C
{
private:
string A;
double B;
public:
//empty constructor
C();
C(string, double);
}
我的C.cpp文件:
//this is how I declare the empty constructor
C::C()
{
}
C::C(string a, double b)
{
A = a;
B = b;
}
我是正确地声明空构造函数的方式还是我需要设置A = NULL和B = 0.0?
答案 0 :(得分:9)
你的空构造函数没有做你想要的。除非您自己执行,否则double
数据成员不会进行零初始化。 std::string
将初始化为空字符串。因此,默认构造函数的正确实现只是
C::C() : B() {} // zero-initializes B
关于其他构造函数,您应该更喜欢初始化列表:
C::C(const string& a, double b) : A(a), B(b) {}
否则,您正在做的是默认构造对象的赋值。
答案 1 :(得分:4)
执行此操作并将构造函数留空是很好的,但您应该知道未初始化的字段具有未定义的值。 string
是一个类,它的默认构造函数负责初始化,但是double
没有在这里初始化(在你的defualt构造函数中),并且它的值是未定义的(它可能是之前存在的任何值)存储器)。
答案 2 :(得分:2)
A是std::string
,您不能将其设置为NULL
,但可以设置为空字符串,std::string
具有默认构造函数,默认情况下将其初始化为空字符串。
C::C()
:B(0.0)
{
}
也许您需要一个带默认参数而不是两个构造函数的构造函数构造函数?
C(const string& a= "", double b= 0.0)
: A(a),
B(b)
{
}
答案 3 :(得分:2)
您是唯一可以回答此问题的人,因为它完全取决于完全您对默认构造对象的要求。由于您没有提到您的要求,因此无法给出明确的答案。有些人会猜测你应该将B
初始化为0,但是这个决定应该基于你的设计,而不是基于“良好”编程实践的各种概念。
答案 4 :(得分:1)
你可以保持原样。您可以这样做,因为string
和double
都可以默认构建。这意味着您可以说string foo;
而不会出现任何错误。
将此与此处发生的事情进行对比:
class Bar{
private:
Bar(); //Explicitly private;
};
Bar b;
这里我们收到一个错误,没有找到构造函数Bar::Bar()
。
至于它是否是一个好主意:如果不知道这个类将会被使用的情况,很难说。也许让它处于一个未配置的位置是完全明智的。但是对于许多类,例如表示文件的类,允许不指向任何文件的文件对象显然是错误的。
答案 5 :(得分:0)
您正在做的正确,您可以通过编译代码来查看它。您的默认构造函数将通过调用其默认构造函数来初始化字符串和double。如果在类中定义任何构造函数,它将隐藏编译器为您创建的默认构造函数。
您可以像这样编写
来改进构造函数代码C::C(string a, double b):A(a), b(b)
{
}
答案 6 :(得分:-1)
这是在现代C ++(C ++ 11及更高版本)中应该如何做:
C() = default;
这为您提供了默认的构造函数,并且避免了必须编写一个空的正文。
还使用初始化列表来初始化构造函数参数,如其他答案中突出显示的那样。