当我只调用构造函数时会发生什么?

时间:2011-07-23 05:38:08

标签: c++

这可能听起来很幼稚。我想知道当我显式调用这样的构造函数时会发生什么:

class A{
/*...*/
  public:
    A(){}
};
int main(){
  A();
  return 0;
}

是否创建了一个无用的对象,它在main()的范围结束之前一直保留在内存中?

5 个答案:

答案 0 :(得分:3)

您创建一个持续到语句结尾的对象。

答案 1 :(得分:2)

它被认为是一个无名的临时表,在完整表达式结束后会被销毁。在这种情况下,分号后面的点。为了证明这一点,使用print语句创建一个析构函数。

答案 2 :(得分:2)

  

当我显式调用这样的构造函数时

你不是在这里调用构造函数;但是要创建一个立即被破坏的临时对象。可以使用该类型的对象显式调用构造函数(这是不可取的)。

  

是否创建了一个无用的对象,它一直保留在内存中   main()的范围结束了吗?

在函数结束之前它没有范围,但直到;结束。

答案 3 :(得分:1)

严格来说,你永远不能直接调用C ++中的构造函数。当您导致实例化类类型的对象时,实现将调用构造函数。

语句A();是表达式语句,表达式是显式类型转换的简并形式(功能表示法)。 A指的是类型,严格来说构造函数没有名称。

来自标准(5.2.3 [expr.type.conv] / 2:

  

表达式T(),其中T是非数组完整对象类型的简单类型说明符或(可能是cv限定的)void类型,创建指定类型的右值,这是价值初始化[...]。

因为您的类类型具有用户声明的默认构造函数,所以此临时值的初始化将使用此构造函数。 (见8.5 [dcl.init] / 5)

答案 4 :(得分:0)

好的,我重新访问了临时,发现在上面的例子中,它实际上是初始化对象的表达式的一部分。所以是的,范围结束于;

Here:

创建临时对象以初始化引用变量时,临时对象的名称与引用变量的名称相同。在评估完整表达式(一个不是另一个表达式的子表达式的表达式)期间创建临时对象时,它将作为其评估中的最后一步被销毁,该步骤在词法上包含创建它的点。