说我有一个class A
并有声明:
A a1(1);
A a2; A2(1);
这两个陈述有什么区别?
我知道第一个陈述是直截了当的,但是在陈述2旁边发生了什么?
答案 0 :(得分:5)
A a1(1);
通过调用带有参数a1
的构造函数,创建类A
的实例1
。
A a2; a2(1);
这个实际上是两个陈述。第一个A a2;
通过调用a2
的默认构造函数创建类A
的实例A
。第二个a2(1);
然后使用参数A::operator()
调用1
(如果A
未定义operator()
,则会产生错误。)
答案 1 :(得分:4)
不同之处在于,对于大多数类型,第二种不会编译。
第一个声明一个变量并用值1
初始化它。从这样的值初始化称为直接初始化。
第二个声明一个变量并默认初始化它;然后它试图像函数一样调用它,只有当它具有operator()
的合适重载时才有效。在这种情况下,它会执行运算符定义的任何操作。
也许你的意思是:
A a2; a2 = 1;
默认初始化变量,然后赋值1.对于普通类型,这将与第一个具有相同的效果。对于定义构造函数和赋值运算符的类型,它将取决于如何定义它们。
答案 2 :(得分:0)
构造函数是在创建Object期间调用的特殊函数。因为第一个语句编译符号,它有一个匹配的构造函数。但是第二个不会创建任何实例,因为它为它提供了实现。
*class Shape
{
private:
int cm;
public:
// Shape()
// {
// }
// Shape(int m_cm)
// {
// cm=m_cm;
// }
};*
上面的代码可以创建一个实例仍然无法启动值 S(7)。