这可能听起来很幼稚。我想知道当我显式调用这样的构造函数时会发生什么:
class A{
/*...*/
public:
A(){}
};
int main(){
A();
return 0;
}
是否创建了一个无用的对象,它在main()的范围结束之前一直保留在内存中?
答案 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)
好的,我重新访问了临时,发现在上面的例子中,它实际上是初始化对象的表达式的一部分。所以是的,范围结束于;
创建临时对象以初始化引用变量时,临时对象的名称与引用变量的名称相同。在评估完整表达式(一个不是另一个表达式的子表达式的表达式)期间创建临时对象时,它将作为其评估中的最后一步被销毁,该步骤在词法上包含创建它的点。