这些对象初始化有什么区别?

时间:2014-10-02 12:16:57

标签: c++ oop

#include <iostream>
#include <string>
class MyClass{
public:
    MyClass(){
        std::cout << "Called Constructer A \n";
    }
    MyClass(int n){
        std::cout << "Called Constructer B \n";
    }
};
int main(){
    MyClass a(); //It's not works as expect
    MyClass b(0); //But this works
    MyClass c;
    MyClass d = MyClass();
    MyClass e = MyClass(0);

}

eb的区别如何,以及为什么b有效,而不是a

1 个答案:

答案 0 :(得分:2)

a被声明为返回MyClass

的函数

b是使用int参数

构造的常规方法

c是没有参数构建的常规方法

d需要一个可访问的副本(/ move)-constructor,因为从技术上讲,它将RHS上的临时副本复制到d,但编译器可能实际上并未调用它。

e是相同的,但使用int构造函数。如果你做了

MyClass e = 0;

这也需要将int作为非显式的构造函数。

回答问题&#34; e与b&#34;有什么不同?这两个对象是相似的,但如果您的类没有可访问的复制/移动构造函数,则与e一起使用的构造将无法编译。 (在C ++ 11中移动构造函数)

b似乎没有声明一个函数,因此不像a。

那样失败

在C ++ 03中,如果你放入

class MyClass {

     // etc.
  private:
      MyClass( const MyClass& );
};

编译器会在创建de

的行上抱怨

在C ++ 11中

 class MyClass {
      // etc.

      // this can be public too
      MyClass( MyClass&& ) = delete;
 };

将调用编译器错误&#34;使用已删除的函数&#34;当您尝试创建de时。 除非您执行以下操作,否则私有拷贝构造函数也会产生错误:

class MyClass{
public:
    MyClass(){
        std::cout << "Called Constructer A \n";
    }
    MyClass(int n){
        std::cout << "Called Constructer B \n";
    }

    MyClass( MyClass const&) = delete; // cannot copy
    MyClass( MyClass && ) = default; // but you CAN move

};

现在你的代码将编译。

虽然我们在C ++ 11中讨论构造函数的主题,但您也可以:

   MyClass f{}; // not a function
   MyClass g{1};
   MyClass h = MyClass{};
   MyClass i = MyClass{0};
   MyClass j = {};
   MyClass k = {0};

请注意,如果我将移动构造函数(当前=默认值)更改为

       MyClass( MyClass && ) 
      { 
          std::cout << "Moved\n";
      }    

我试过了,&#34;感动&#34;从未打印过。编译器可以(并且确实)优化它。但它必须是可访问的。

相关问题