如果我有以下课程:
class A{
private:
int x;
public:
A(){
x = 5;
}
};
这两个声明之间的区别是什么?
A a;
VS
A a();
感谢。
答案 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
类型的对象。