我很确定这是一个重复的问题,但我一直在寻找一段时间而且我没有变得更聪明。
想象一下这个课程:
class Entity {
public:
int x, y;
Entity() : x(0), y(0) { }
Entity(int x, int y) : x(x), y(y) { }
}
以下是初始化类的多种方法:
Entity ent1;
Entity ent2();
Entity ent3(1, 2);
Entity ent4 = Entity();
Entity ent5 = Entity(2, 3);
我也知道可以在堆内存上创建一个对象,但这对我来说并不是一个很大的谜。
这就是我认为我知道的事情
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
如果我错了,请纠正我。 但我的问题是,这些初始化对象的方式之间的区别是什么?
我不确定我应该使用哪一个。
答案 0 :(得分:4)
Entity ent1;
使用类
的默认构造函数Entity ent2();
如果可能的话,编译器会将此定义视为函数原型。
Entity ent3(1, 2);
调用了用户定义的构造函数
Entity ent4 = Entity();
ent2
案例的 正确的 版本。默认构造函数作为值初始化的一部分调用。它的形式允许避免大多数Vexing Parse - 模糊解决原则,使ent2
不正确。
Entity ent5 = Entity(2, 3);
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};
请注意,统一初始化语法有一个警告。例如。这一行
std::vector<int> v(10);
声明一个包含10个元素的向量。但这一个
std::vector<int> v{10};
声明一个使用int类型的单个元素初始化的向量,其值为10.所有因为std::vector
得到了构造函数:
vector( std::initializer_list<T> init, const Allocator& alloc = Allocator() );
如果你不能在不调用不需要的构造函数的情况下触发MVP和{}而不使用(),则值初始化赋值语法允许解决问题。