作用域
1,全局作用域, 名字空间域
2,局部作用域,块作用域
3,类域
数据隐藏
在不同的作用域可以定义多个相同名称的变量,在访问时只访问本作用域的变量,屏蔽更大作用域的变量。
名字空间
1,一种作用域的划分,通常用于区分项目中的模块与组件,可以在命名空间中定义变量与函数。
(1)定义
namespace U_fun1
{
int age=10;
};//命名空间U_fun1中有一个变量age
namespace U_fun2
{
int age=11;
};//命名空间U_fun2中也有一个变量age
(2)使用
cout<<U_fun1::age<<endl;
cout<<U_fun2::age<<endl;//使用时加上命名空间域
2,关键字namespace,可以分开使用,例如:
namespace U_fun1
{
int age=10;
};//命名空间U_fun1中有一个变量age
namespace U_fun1
{
int high=120;
};//命名空间U_fun1里面还有一个变量high,也就是说明明空间里的变量不必全定义在一起,也可以分开定义
3,命名空间可以嵌套,即在命名空间中可以再嵌套定义命名空间。
(1)定义
namespace U_fun1
{
namespace U_U_fun1
{
int age=10;
};
};//命名空间U_fun1中有一个变量age
(2)使用
cout<<U_fun1::U_U_fun1::age<<endl;
4,命名空间可以取别名
例如3中所定义的名字空间U_fun1::U_U_fun1
,可以给他取一个别名
namespace n=U_fun1::U_U_fun1;
使用
cout<<n::age<<endl;
5,命名空间作用域与全局作用域的数据隐藏
int age=5;//该age表示全局作用域中的age
namespace U_fun1
{
int age=10;//该age表示U_fun1中的age
void fun()
{
age=20;//命名空间内部的函数中的该语句修改的是该命名空间中的age(符合数据隐藏的原理)
::age=9;//该语法就会修改全局作用域中的age
}
};
名字空间的使用
关于如下的命名空间的使用
int age=5;//该age表示全局作用域中的age
namespace U_fun1
{
int age=10;//该age表示U_fun1中的age
void fun()
{
age=20;//命名空间内部的函数中的该语句修改的是该命名空间中的age(符合数据隐藏的原理)
::age=9;//该语法就会修改全局作用域中的age
}
};
1,如前文所讲的使用方法,直接命名空间名::变量名/函数名
。,例如cout<<U_fun1::age;
,这种方法更加推荐,不会产生二义性
2,在要使用某个命名空间时先声明,例如:using namespace U_fun1;
接下来cout<<age;
访问的就直接是U_fun1
名字空间中的变量了,不过可能会产生二义性。例如如果在程序一开始就声明在整个程序中都用U_fun1中的变量,U_fun1中有age变量,同时又定义了一个全局变量age,这时候数据隐藏的原理不适用,那么在使用age变量的时候就会产生二义性,编译会报变量不明确的错误。
3,提前声明使用具体的某个变量using U::fun1::age
,接下来也可以直接通过age
直接访问