【发布时间】:2010-10-15 23:46:01
【问题描述】:
我很好奇,在类构造函数中声明的不是该类数据成员的变量的范围是什么?
例如,如果一个构造函数需要一个迭代的 int i,这个变量会在构造函数完成后被销毁,还是对程序来说是全局变量?
【问题讨论】:
标签: c++ constructor scope
我很好奇,在类构造函数中声明的不是该类数据成员的变量的范围是什么?
例如,如果一个构造函数需要一个迭代的 int i,这个变量会在构造函数完成后被销毁,还是对程序来说是全局变量?
【问题讨论】:
标签: c++ constructor scope
从这个意义上说,构造函数就像任何其他函数一样——在内部声明的任何变量都有通常的范围限制,一旦构造函数完成,它们肯定都会超出范围并被销毁。
【讨论】:
像任何其他函数一样,如果它是一个局部变量,它将在函数结束时被“销毁”。本地范围。
【讨论】:
正如经常发生的那样,您可能会混淆范围和生命周期的概念,所以我将同时解决这两个问题。
在构造函数中声明的名称的 范围 与任何本地名称的范围相同(它是 constructor 的事实没有任何区别):名称的范围延伸到声明名称的块的末尾(并且当名称被隐藏时,它可以有“洞”,通过一个甚至“更本地”的实体声明同名)。
在构造函数中定义的 am 对象的生命周期受与任何本地定义对象的生命周期相同的规则控制(事实上它是一个 构造函数 没有任何区别):一个对象具有自动存储期限的对象在其作用域结束时被销毁,而具有静态存储期限的对象则永远存在。
【讨论】:
在类构造函数中声明的变量在类构造函数的范围内可用,并且没有更高的范围。
public MyClass() {
int i = 0; // i is only available inside this constructor.
// It can't be used in any other function of this class or any other.
}
【讨论】:
无论函数如何,局部变量在超出范围时都会被销毁。它们不会成为“全球性的”。
【讨论】:
作用域可以是静态的(词法的)或动态的。大多数语言使用词法作用域,这意味着作用域由程序的文本决定(例如“在定义它的大括号集合内”),而不是由您所写内容的含义决定。
【讨论】: