两个语句C ++之间的区别

时间:2013-10-23 06:58:54

标签: c++ class object constructor operator-overloading

说我有一个class A并有声明:

  

A a1(1);

     

A a2; A2(1);

这两个陈述有什么区别?
我知道第一个陈述是直截了当的,但是在陈述2旁边发生了什么?

3 个答案:

答案 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)。