的。如果我宣布一个对象是这样的:范围内,括号声明的对象
void main()
{
myclass objectA(anotherclass(true,true,0));
}
即我通过直接调用后者的构造函数创建一个对象A和另一个对象“anotherclass”,什么是“anotherclass””范围?
只有当main()完成时才会被破坏吗?
的。如果我宣布一个对象是这样的:范围内,括号声明的对象
void main()
{
myclass objectA(anotherclass(true,true,0));
}
即我通过直接调用后者的构造函数创建一个对象A和另一个对象“anotherclass”,什么是“anotherclass””范围?
只有当main()完成时才会被破坏吗?
在包含它的完整表达式的末尾,即对myclass
的构造函数的返回返回时,临时对象被破坏。
每个段落的C++ 11标准的12.2/3:
临时对象被销毁作为评价全表达式(1.9)的最后一步 即(词法)包含点他们被创建了。即使评估在抛出异常时结束,也是如此 。破坏临时对象的值计算和副作用仅与全表达式相关联,而不与任何特定的子表达式相关联。
出于这个原因,如果myclass
的构造通过参考(无论是左值参考const
或右值参考)开anotherClass
类型的参数,不得将其存储以供将来使用,因为它会被悬挂如果临时传递,并且取消引用它将是未定义的行为。
只有objectA
超出范围,并从main()
函数返回时被破坏。
anotherclass
对象没有范围。范围是名称的属性,而不是对象的属性,并且该对象未被命名。这只是一个临时对象,并将在完整表达式的末尾被销毁。
下面的范围的定义(§3.3.1):
一般来说,每一个特定的名称是有效的仅在程序文本的一些可能不连续 部分称为其范围。
嗯。那么如何重写一下类似“当对象被超出范围时被破坏”的东西,我认为这是表达对象生命周期结束的常用方式? – Roddy 2013-03-22 22:51:32
谢谢你的回答,你真的帮了我很多! – 2013-03-22 22:57:24
@Roddy对于很多对象来说这是真的。当名称超出范围时,已命名并具有自动存储持续时间的对象将被销毁。 “当物体超出范围时”只是一种更快捷的说法。对象的生命周期的真正定义是非正式的,当它是析构函数启动时。 – 2013-03-22 22:59:43
谢谢!请问你在哪里学习C++和C++ 11? – 2013-03-22 22:51:39
@JohnnyPauling:嗯,我想在过去三个月里花了很长时间在SO上:)这是最好的学习场所。 – 2013-03-22 22:52:38
我同意你的观点,这就是为什么我问这么多问题,尽管其中许多问题都很愚蠢。感谢像你这样的人我一直在学习!谢谢! – 2013-03-22 22:56:40