c ++构造函数的差异

时间:2012-03-07 22:08:28

标签: c++ constructor

如果我有以下课程:

class A{
private:
  int x;
public:
  A(){
    x = 5;
  }
};

这两个声明之间的区别是什么?

A a;

VS

A a();

感谢。

4 个答案:

答案 0 :(得分:8)

A a;

这将创建一个A类型的对象,并调用默认构造函数。

A a();

这声明了一个名为a的函数,它返回A类型的对象。

答案 1 :(得分:3)

或许有趣的是,除了其他人所说的,以下两行之间存在差异:

A a;
A a{}; // Using uniform initialization from C++11 to avoid the ambiguity

以及以下两行之间:

A* a = new A;
A* a = new A(); // or new A{}

在每个示例的第一行中,对象是默认初始化的。在第二行中,对象是值初始化的。不同之处在于,默认初始化将调用A的默认构造函数,value-initialization将首先对对象进行零初始化,然后调用默认构造函数(如果没有用户提供的构造函数)。

对于任何非类类型的内容,默认初始化将不执行初始化。对于任何不是类类型或没有用户提供的构造函数的联合,value-initialization将零对象初始化。

答案 2 :(得分:2)

第二个代码没有定义名为a的对象,它声明了一个函数 a,返回类型为A,没有参数。 C ++编译器的这个属性通常称为most vexing parse

答案 3 :(得分:2)

A a;

这声明了类A的元素,并使用默认构造函数构造它。

A a();

这声明了一个名为a的函数,它不带参数并返回A类型的对象。