关于C++:用构造函数重载初始化多个变量

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模式下,许多现代编译器也会做一些复制省略):

  • demo(0);

    代码demo(0)调用demo(int s)构造函数。创建临时右值。现在我们有了一个临时对象,其值为:

    1
    2
    size = 0
    k = uninitialized
  • demo a = demo(0);

    然后使用隐式复制构造函数创建demo a

    我们现在有一个名为ademo对象,其值如下:

    1
    2
    size = 0
    k = uninitialized
  • a = 4.7;

    因为已经构造了a,所以这将调用隐式赋值运算符。默认的赋值操作符将把一个对象中的所有值复制到另一个对象中。这意味着需要先将4.7转换为demo对象。这是可能的,因为您的demo(double p)构造函数。

    因此,将使用以下值创建一个临时demo对象:

    1
    2
    size = uninitialized
    k = uninitialized + 4.7 = undefined

    这些值将被复制到a中,因此a的两个数据成员都将是未定义的。

  • 可能的解决方案

    宋元耀使用多参数构造器的解决方案是一种很好的方法。

    使用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;
    }