C++支持多种作用域:全局域、局部域、块域、类域,还有名字空间域等。
作用域:规定变量能够被访问的范围,离开这个范围的变量不能被访问。
作用域是一个独立的地盘,让变量不会暴露出去,也就是说作用域最大的作用就是隔离变量,不同作用域中同名的变量不会冲突。
局部域:局部变量所在位置,比如 函数体、for循环循环体 等。局部变量的生存期只在局部域中,程序退出局部域,局部变量就消亡。
块域:一对花括号之间的区域,比如 if语句的花括号中的语句体。块域中变量生存期从定义处开始,在块域结束时消亡。
类域:我们自定义的class,其中的成员属性和成员方法就在其类域中。
(1)在类中成员可以任意相互使用 ,如fun()可直接调用fun2()。在类外,就需要通过 "对象.成员" 的方法,才能调用对象的公有属性或公有方法。
(2)在类中直接定义的函数,无需在函数名前加上作用域解析符 (类名::);在类中声明,在类外定义的函数,在类外定义时,需要加上作用域解析符。
全局域:main主程序之外,到整个项目的多个文件的范围。若多个源文件中使用了同名不同实体的全局变量,就会发生命名冲突(全局名字空间污染)。
//a.h
extern int g_max;
extern void fun();
//a.cpp
int g_max = 10;
void fun(){
cout << g_max << endl;
}
//b.h
extern int g_max;
extern void fun();
//b.cpp
int g_max = 200;
void fun(){
cout << g_max << endl;
}
此时,若同时引用 a.h 和 b.h ,就发生了变量或函数重定义(命名冲突)。
为了能使用同名但不同实体的变量,避免命名冲突,C++引入了名字空间域。
名字空间域:为解决全局变量命名冲突,将可能与其他全局变量或函数命名冲突的全局变量或函数放到自己的名字空间中。
(1)使用时需 名字空间名::变量/函数。:: 是作用域解析符,标识右边的变量或函数是属于哪个名字空间的。
(2)也可以使用 using 名字空间::变量名/函数名 的方法,指定该变量名或函数就是指定名字空间中的变量或函数,可以直接使用。
但不能重复指定。
(3)使用 using namespace 名字空间名。这样就可以直接使用该名字空间中变量或函数。但不能存在其他与该名字空间中命名冲突的全局变量。
命名空间可嵌套命名空间: