Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我只调用构造函数时会发生什么?_C++ - Fatal编程技术网

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

C++ 当我只调用构造函数时会发生什么?,c++,C++,这听起来可能很幼稚。我想知道当我显式调用构造函数时会发生什么: class A{ /*...*/ public: A(){} }; int main(){ A(); return 0; } 是否创建了一个无用的对象,它会一直保留在内存中,直到main()的作用域结束?您创建的对象会一直保留到语句结束。它被认为是一个无名的临时对象,在完整表达式结束后会被销毁。在本例中,分号后面的点。要证明这一点,请使用print语句创建析构函数 当我显式调用这样的构造函数时 您没有在这里调用

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

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

是否创建了一个无用的对象,它会一直保留在内存中,直到main()的作用域结束?

您创建的对象会一直保留到语句结束。

它被认为是一个无名的临时对象,在完整表达式结束后会被销毁。在本例中,分号后面的点。要证明这一点,请使用print语句创建析构函数

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

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

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


直到函数结束,它才有作用域,但直到
结束。

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

语句
A()
是一个表达式语句,表达式是显式类型转换(函数表示法)的退化形式
A
引用类型,严格来说构造函数没有名称

根据标准(5.2.3[expr.type.conv]/2:

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


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

好的,我重新访问了临时类,发现在上面的示例中,它实际上是初始化对象的表达式的一部分


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

因此在运行时,A()将创建一个对象并在继续之前销毁它?在这种情况下,编译器将优化掉它,只剩下
返回0;
@Abhi Yes。这种对象被称为右值。@Gene:你怎么能在不知道圆点内部是什么的情况下分辨出来?@Gene:不允许优化掉它。构造函数/析构函数可能ve会影响开发人员的需求。复制省略是删除潜在对象的唯一方法,只有在可以调用复制构造函数的情况下才会发生。只需添加
就可以按照Gene所说的做,然后在下一行再次调用构造函数,这就是你将看到发生了什么。如果你正常创建了两个对象(作为l值),您将看到ctor dtor dtor,但创建这样的无名对象(r值)时,您将看到ctor dtor dtor。“直到函数结束,它才有作用域,直到;结束。”恕我直言,但所创建的临时对象的作用域将具有堆栈帧寿命的作用域。因此,在上述情况下,作用域将一直保持到关闭“}”是编译器为函数main遇到的。这是因为编译器只有在遇到}时才会调用析构函数。上面的注释是针对iammilind的,我不知道为什么我的@不起作用:(@Viren,在本例中,
A()
的作用域仅在
结束之前,而不是
main()结束之前)
。请参见@Viren:The temporary object在
处消亡;
@iammilind:He正在调用构造函数。创建临时对象的一部分是正确调用构造函数。