2013-03-22 99 views
2

的。如果我宣布一个对象是这样的:范围内,括号声明的对象

void main() 
{ 
    myclass objectA(anotherclass(true,true,0)); 
} 

即我通过直接调用后者的构造函数创建一个对象A和另一个对象“anotherclass”,什么是“anotherclass””范围?

只有当main()完成时才会被破坏吗?

回答

4

在包含它的完整表达式的末尾,即对myclass的构造函数的返回返回时,临时对象被破坏。

每个段落的C++ 11标准的12.2/3:

临时对象被销毁作为评价全表达式(1.9)的最后一步 即(词法)包含点他们被创建了。即使评估在抛出异常时结束,也是如此 。破坏临时对象的值计算和副作用仅与全表达式相关联,而不与任何特定的子表达式相关联。

出于这个原因,如果myclass的构造通过参考(无论是左值参考const或右值参考)开anotherClass类型的参数,不得将其存储以供将来使用,因为它会被悬挂如果临时传递,并且取消引用它将是未定义的行为。

只有objectA超出范围,并从main()函数返回时被破坏。

+0

谢谢!请问你在哪里学习C++和C++ 11? – 2013-03-22 22:51:39

+1

@JohnnyPauling:嗯,我想在过去三个月里花了很长时间在SO上:)这是最好的学习场所。 – 2013-03-22 22:52:38

+0

我同意你的观点,这就是为什么我问这么多问题,尽管其中许多问题都很愚蠢。感谢像你这样的人我一直在学习!谢谢! – 2013-03-22 22:56:40

2

anotherclass对象没有范围。范围是名称的属性,而不是对象的属性,并且该对象未被命名。这只是一个临时对象,并将在完整表达式的末尾被销毁。

下面的范围的定义(§3.3.1):

一般来说,每一个特定的名称是有效的仅在程序文本的一些可能不连续 部分称为其范围

+0

嗯。那么如何重写一下类似“当对象被超出范围时被破坏”的东西,我认为这是表达对象生命周期结束的常用方式? – Roddy 2013-03-22 22:51:32

+0

谢谢你的回答,你真的帮了我很多! – 2013-03-22 22:57:24

+0

@Roddy对于很多对象来说这是真的。当名称超出范围时,已命名并具有自动存储持续时间的对象将被销毁。 “当物体超出范围时”只是一种更快捷的说法。对象的生命周期的真正定义是非正式的,当它是析构函数启动时。 – 2013-03-22 22:59:43