让我们在一个类中说一个构造函数被重载了。是否可以使用同一类的不同构造函数为单个对象初始化多个数据成员?
例如:
class demo{
int size;
double k;
public:
demo(int s){
size=s;
}
demo(double p){
k = size+p;
}
void show(){
cout<<size<<" "<<k<<"\n";
}
};
int main(){
demo a = demo(0);
a = 4.7;
a.show();
return 0;
}
这可能吗?
答案 0 :(得分:2)
您应该定义一个ctor,它可以使用多个参数来初始化多个数据成员:
demo(int s, double p) {
size = s;
k = size + p;
}
然后
int main() {
demo a(0, 4.7);
a.show();
return 0;
}
答案 1 :(得分:2)
我认为你是在Builder Pattern之后。
答案 2 :(得分:2)
不,一旦构造了对象,就构建它。
让我们看看你的代码并看看它做了什么(假设没有优化,请注意许多现代编译器即使在调试或-O0模式下也会执行一些copy-elision):
demo(0);
代码demo(0)
调用demo(int s)
构造函数。创建临时rvalue。所以现在我们有一个带有值的临时对象:
size = 0
k = uninitialized
demo a = demo(0);
demo a
。
我们现在有一个名为demo
的{{1}}对象,其中包含以下值:
a
size = 0
k = uninitialized
由于a = 4.7;
已经构建,因此会调用隐式assignment-operator。默认赋值运算符将所有值从一个对象复制到另一个对象。这意味着首先需要将a
转换为4.7
对象。这可能是因为您的demo
构造函数。
因此将使用值
创建临时demo(double p)
对象
demo
这些值将被复制到size = uninitialized
k = uninitialized + 4.7 = undefined
,因此a
的两个数据成员都将是未定义的。
可能的解决方案
songyuanyao使用具有多个参数的构造函数的解决方案是一种很好的方法。
使用setter是另一种方式。
无论哪种方式,我都建议让构造函数为数据成员提供默认值。
a
在这里,你可以创建一个setter。
demo(int s)
{
size = s;
k = 0.0; // or some other suitable value
}
然后你可以这样做:
void setK (double p)
{
k = size + p;
}