用C ++初始化对象的不同方法

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

如果我错了纠正我。但是我的问题是,初始化对象的这些方式之间有什么区别?

我不确定何时应该使用哪一个。


Swi*_*Pie 6

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的情况下既不使用()也不在不调用不希望的构造函数的情况下使用{},则值初始化赋值语法可以解决此问题。