4 c++ constructor initialization class c++11
我很确定这是一个重复的问题,但是我已经搜索了一段时间,但没有任何更聪明的方法。
想象一下这堂课:
class Entity {
public:
int x, y;
Entity() : x(0), y(0) { }
Entity(int x, int y) : x(x), y(y) { }
}
Run Code Online (Sandbox Code Playgroud)
这是初始化类的多种方法:
Entity ent1;
Entity ent2();
Entity ent3(1, 2);
Entity ent4 = Entity();
Entity ent5 = Entity(2, 3);
Run Code Online (Sandbox Code Playgroud)
我也知道,有可能在堆内存中创建一个对象,但这对我来说并不是一个很大的谜。
这是我想我知道的
ent1-使用默认构造函数,因此x = 0和y = 0
ent2-使用默认构造函数,因此x = 0和y = 0(不确定)
ent3-构造函数,所以x = 1和y = 2
ent4-默认构造函数,因此x = 0和y = 0
ent5-构造函数,所以x = 2和y = 3
如果我错了纠正我。但是我的问题是,初始化对象的这些方式之间有什么区别?
我不确定何时应该使用哪一个。
Entity ent1;
Run Code Online (Sandbox Code Playgroud)
该语句使用class的默认构造函数Entity。
Entity ent2();
Run Code Online (Sandbox Code Playgroud)
如果可能的话,此定义将被编译器视为函数原型。
Entity ent3(1, 2);
Run Code Online (Sandbox Code Playgroud)
用户定义的构造函数被调用ent3。
Entity ent4 = Entity();
Run Code Online (Sandbox Code Playgroud)
这是案例的正确版本ent2。默认构造函数作为值初始化的一部分被调用。它的形式可以避免“最令人讨厌的解析”-解决ent2不正确的歧义解决原理。
Entity ent5 = Entity(2, 3);
Run Code Online (Sandbox Code Playgroud)
ent3案例的版本。作为值初始化的一部分调用的用户定义的构造函数。
您的问题被标记为C ++ 11,并且C ++ 11允许统一的初始化语法:
Entity ent12{}; // This is a legal alternative of ent2 case
Entity ent13{1, 2};
Entity ent14 = {};
Entity ent15 = Entity{2, 3};
Run Code Online (Sandbox Code Playgroud)
请注意,统一初始化语法有一个警告。例如这条线
std::vector<int> v(10);
Run Code Online (Sandbox Code Playgroud)
声明一个由10个元素组成的向量。但是这个
std::vector<int> v{10};
Run Code Online (Sandbox Code Playgroud)
声明一个向量,该向量使用类型为int的单个元素进行初始化,该元素的值为10。这是因为std::vector定义了具有以下签名的构造函数:
vector( std::initializer_list<T> init, const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)
如果您不能在不触发MVP的情况下既不使用()也不在不调用不希望的构造函数的情况下使用{},则值初始化赋值语法可以解决此问题。