2014-10-02 69 views
-3
#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); 

} 

那么,如何从e不同b,为什么b作品,但不a这些对象初始化之间有什么不同?

+7

可能是几个问题的副本 – CashCow 2014-10-02 12:18:53

+0

好 - 不仅需要一个答案,而且对于我们来说这个问题! – 2014-10-02 12:20:23

+2

请参阅http://stackoverflow.com/q/24953658/981959和[标签:最棘手的解析]。请在创建新问题之前进行搜索 – 2014-10-02 12:23:12

回答

2

a被声明为返回一个MyClass的

b是与一个int参数

c构建以正常的方式是不带参数

d需要构建正常方式的功能可访问的复制(/移动) - 构造器,从技术上讲,它将RHS上的临时文件复制到d,但编译器可能实际上不会调用它。

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

MyClass e = 0; 

这也将需要的构造函数,使int是非显式的。

要回答“e如何与b不同”的问题。这两个对象是相似的,但如果您的类没有可访问的复制/移动构造函数,则与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; 
}; 

将调用当您尝试创建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"; 
     }  

我试过了,“Moved”从未打印过。编译器可以(并且)优化它。但它必须可以访问。

相关问题