使用=来构造新变量

时间:2014-01-16 21:38:21

标签: c++ constructor initialization variable-assignment default-constructor

我对使用=初始化新变量持谨慎态度:

MyClass my_var = MyClass(some_data);
  1. 因为我认为这需要my_var首先默认构建,然后分配。
  2. my_var是共享内存时,这可能会导致竞争条件。
  3. 有人可以证实或否认我的恐惧吗?原始类型的处理方式不同吗?

3 个答案:

答案 0 :(得分:2)

  

因为我认为这需要首先默认构造my_var,然后分配。

没有。在类类型的变量声明上使用=运算符具有特殊处理。编译器永远不会像你想象的那样默认构造然后复制变量对象。实际发生的事情是:

  1. 临时MyClass对象将从some_data复制构造,然后my_var将从temp复制构造,然后临时将被释放。好像你写了这个:

    MyClass my_var(MyClass(some_data));
    
  2. 编译器将完全优化掉temp,并直接从my_var复制构造some_data。好像你写了这个:

    MyClass my_var(some_data);
    

    这是通常的情况,特别是如果你写这个:

    MyClass my_var = some_data;
    

    而不是:

    MyClass my_var = MyClass(some_data);
    
  3.   

    当my_var是共享内存时,这可能会导致竞争条件。

    你写的方式,没有。 my_var是函数/方法的局部变量,或者是全局变量。无论哪种方式,在同一语句中声明和赋值变量都不是竞争条件,因为变量在构造之后才能共享。如果先声明变量并在单独的语句中指定它,那么就会出现竞争条件。

答案 1 :(得分:1)

  

因为我认为这需要首先默认构造my_var,然后分配。

没有。 my_var永远不会默认构建,也不是临时构造。首先使用MyClass构造类型some_data的右值,然后调用复制构造函数(如果您在C ++ 11中,则移动构造函数)来构造my_var

  

当my_var是共享内存时,这可能会导致竞争条件。

嗯,是的。从理论上讲,它可能导致竞争条件。

答案 2 :(得分:0)

在您的代码行中,只调用MyClass的复制构造函数。

如果您在代码MyClass my_var中撰写my_var = some_data及更高版本,则会调用MyClass::operator=(...)

为了完成这个答案,我没有看到共享变量在构造过程中如何“处于竞争状态的风险中”(因为它在构建之前无法共享)。