关于全局变量:两段代码中哪个globalOrLocal是全局变量?
问题解答
咱们先把两个案例拆开来分析,你之前的理解存在一个关键误区,我给你逐一梳理清楚:
Case I:类内部定义的变量
class A { int globalOrLocal; funcA1() {…} funcA2() {…} }
这里的globalOrLocal不是全局变量,它是类A的非静态成员变量(因为没有加static关键字):
- 它的作用域仅限于
A类的实例对象内部,只有创建了A的对象后,这个变量才会分配内存; - 内存存储位置取决于对象的创建方式:如果是栈上创建的
A对象,这个变量就在栈上;如果是堆上new出来的A对象,它就跟着对象存在堆里; - 它不属于全局命名空间,只能通过
A的对象(比如A obj; obj.globalOrLocal)来访问(如果是私有成员还得通过类的方法访问)。
Case II:类外部定义的变量
int globalOrLocal; class B { funcB1() {…} funcB2() {…} }
这里的globalOrLocal才是真正的全局变量:
- 它定义在所有类、函数的外部,属于全局命名空间;
- 程序启动时就会分配内存,存储在全局/静态存储区(不是堆,堆是运行时动态分配内存的区域,全局变量的内存是编译器提前分配好的);
- 整个程序的所有函数、类(只要有权限)都可以直接访问它。
总结一下:只有定义在所有类、函数作用域之外的变量才是全局变量,类内部的成员变量哪怕写在函数外面,也只是类的属性,不属于全局范畴。
内容的提问来源于stack exchange,提问作者P.K.
相关产品推荐
相关产品推荐

