#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
。
答案 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& );
};
编译器会在创建d
和e
在C ++ 11中
class MyClass {
// etc.
// this can be public too
MyClass( MyClass&& ) = delete;
};
将调用编译器错误&#34;使用已删除的函数&#34;当您尝试创建d
和e
时。
除非您执行以下操作,否则私有拷贝构造函数也会产生错误:
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;从未打印过。编译器可以(并且确实)优化它。但它必须是可访问的。