initialize multiple variables with constructor overloading
假设在类中,一个构造函数被重载。是否可以使用同一类的不同构造函数为单个对象初始化多个数据成员?
如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class demo{ int size; double k; public: demo(int s){ size=s; } demo(double p){ k = size+p; } void show(){ cout<<size<<""<<k<<" "; } }; int main(){ demo a = demo(0); a = 4.7; a.show(); return 0; } |
这有可能吗?
不,一旦对象被构造,它就被构造了。
让我们检查一下您的代码,看看它做了什么(假设没有优化,请注意,即使在调试或-O0模式下,许多现代编译器也会做一些复制省略):
代码
1 2 | size = 0 k = uninitialized |
然后使用隐式复制构造函数创建
我们现在有一个名为
1 2 | size = 0 k = uninitialized |
因为已经构造了
因此,将使用以下值创建一个临时
1 2 | size = uninitialized k = uninitialized + 4.7 = undefined |
这些值将被复制到
可能的解决方案
宋元耀使用多参数构造器的解决方案是一种很好的方法。
使用setter是另一种方法。
不管怎样,我建议让构造函数为数据成员提供默认值。
1 2 3 4 5 | demo(int s) { size = s; k = 0.0; // or some other suitable value } |
以下是创建setter的方法。
1 2 3 4 | void setK (double p) { k = size + p; } |
你可以这样做:
1 2 3 4 5 6 7 8 9 | int main () { demo a (0) ; a.setK (4.7) ; a.show () ; return 0 ; } |
我想你是在追求建筑风格。
您应该定义一个可以使用多个参数初始化多个数据成员的ctor:
1 2 3 4 | demo(int s, double p) { size = s; k = size + p; } |
然后
1 2 3 4 5 | int main() { demo a(0, 4.7); a.show(); return 0; } |