在c ++中初始化对象的不同方法

时间:2018-04-12 16:47:51

标签: c++ class c++11 constructor initialization

我很确定这是一个重复的问题,但我一直在寻找一段时间而且我没有变得更聪明。

想象一下这个课程:

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

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

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

1 个答案:

答案 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和{}而不使用(),则值初始化赋值语法允许解决问题。