圆括号内声明对象的作用域
Scope of an inside-parenthesis declared object
如果我这样声明一个对象:
void main()
{
myclass objectA(anotherclass(true,true,0));
}
。我创建一个对象和另一个对象"另一个类"通过直接调用后者的构造函数,什么是"另一个类"的作用域?
只在main()结束时才被销毁吗?
临时对象在包含它的完整表达式的末尾被销毁,即当调用myclass
的构造函数返回时。
c++ 11标准第12.2/3段:
临时对象在最后一步被销毁在(词法上)包含创建点的完整表达式(1.9)中求值。这是真的即使该求值以抛出异常结束。销毁的值计算和副作用临时对象只与完整表达式相关联,而不与任何特定的子表达式相关联。
因此,如果myclass
的构造函数通过引用(对const
的左值引用或右值引用)接受anotherClass
类型的参数,它不应该存储它以供将来使用,因为如果传递临时变量,它将悬空,并且对其解引用将是未定义的行为。
当从main()
函数返回时,只有objectA
超出作用域并被销毁。
anotherclass
对象没有作用域。作用域是名称的属性,而不是对象的属性,并且这个对象没有命名。它只是一个临时对象,将在完整表达式结束时被销毁。
作用域的定义(§3.3.1):
一般来说,每个特定的名称只在一些可能不连续的范围内有效程序文本中称为作用域的部分。
相关文章:
- 在构造函数中输入对象时C++类成员作用域
- 混合指向已分配对象和作用域对象的指针
- 在一个作用域中推送五个对象指针,然后检查对象的布尔值是否为 false,会给出错误
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- 在c++中,全局作用域中只允许"表达式"初始化全局对象.我在哪里可以在标准中找到这个
- 无法访问类作用域中的对象
- 在提升作用域出口中调用对象函数
- 用LD_PRELOAD和C++中的全局作用域对象加载堆分析器
- 将对象的属性传递到方法时出现作用域问题.(opencv相关)
- 在调用函数的作用域中构造返回的对象
- 本地对象的作用域
- 函数作用域的静态非 Pod 对象初始化
- C++有必要删除主作用域末尾动态分配的对象
- 超出作用域在c++对象中意味着什么
- Lambda Capture by Value强制所有作用域对象为常量
- 当类没有析构函数时,智能指针或作用域指针会删除对象吗
- 未在作用域中声明指针对象
- 当shared_ptr的实例仍在作用域中时,共享指针的对象被删除
- 对临时对象的常量引用在函数作用域(生存期)后被破坏
- 堆上的对象何时超出作用域?