目录
3.全局变量在定义是需要注意的问题。(博主在面试的时候被问到过)
1.c++有哪些作用域
c++的作用域可以分为6种,分别是:全局作用域,局部作用域,类作用域,名字空间作用域,语句作用域和名字空间作用域。
2.不同的作用域下定义不同的变量会有什么区别
- 全局变量:属于全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。如果其他不包含该全局变量定义的源文件需要用extern 关键字再次声明这个全局变量,就可以在其他的源文件中使用了。
- 静态全局变量:属于文件作用域。它与全局变量的区别在于如果程序包含多个文件的话,它属于定义它的文件里,不能extern 关键字再次声明这个全局变量作用到其它文件里,即被static 关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
- 局部变量:属于局部作用域。它是自动对象(auto),在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。(个人认为局部作用域包含语句作用域)。
静态局部变量:属于局部作用域。它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。(即被static 关键字修饰过的变量是具有记忆功能的)。
- 类内的普通变量:属于类作用域 ,属于类中定义的某个具体对象。
- 类内的静态变量:属于类作用域,它不属于某个具体对象,它属于整个类。(静态成员函数只能调用类内的静态变量)。
3.全局变量在定义是需要注意的问题。(博主在面试的时候被问到过)
如果在头文件中定义全局变量,当该头文件被多个文件 include 时,该头文件中的全局变量就会被定义多次,导致重复定义,因此不能再头文件中定义全局变量。
4.总结
c++为什么有那么多作用域,而且定义变量的时候还要考虑那么多因素,不麻烦吗?
先说原因:不同区域存放的数据,赋予不同的生命周期,让我们的编程更加灵活。(面试官问时候就这样对答就很nice了)。
我刚学c++的时候也被这些作用域和变量搞迷迷糊糊的,我的建议是初学者不用太刻意去记忆,用到的时候自然就懂了。实践出真知,初学c++一定要多敲代码。