名字空间:划分更多的逻辑空间,有效避免名字冲突的问题
1.什么是命名空间
名字命名空间 namespace 名字空间名 {...}
// 名字空间 n1 域
namespace n1 {
// 全局变量
int g_money = 0;
void save(int money)
{
g_money += money;
}
void pay(int money)
{
g_money -= money;
}
}
2.名字空间合并
名字命名空间 namespace 名字空间名 {...}
名字命名空间 namespace 名字空间名 {...}
编译器会自动将多个名字相同的命名空间合并为一个名字空间
namespace n1 {
// 全局变量
int g_money = 0;
void save(int money)
{
g_money += money;
}
}
namespace n1 {
void pay(int money)
{
g_money -= money;
}
}
3.名字空间声明函数
在命名空间内声明函数,但是在外面定义函数
namespace n3 {
// 全局变量
int g_money = 0;
void save(int money) // 声明并定义
{
g_money += money;
}
void pay(int money); // 声明
}
void n3::pay(int money) // 定义
{
g_money -= money;
}
4.如何使用命名空间呢?(3种)
1) 作用域限定符::
namespace ns {
int g_val = 0;
}
cout << "ns::g_val = " << ns::g_val << endl;
2)名字空间指令
namespace ns {
int g_val = 0;
}
using namespace ns; // 从这行代码开始,ns中的内容在当前作用域可见 -->可见表
g_val = 100;
cout << "g_val = " << g_val << endl;
如果命名空间和main方法中都有g_val变量,它具体使用哪一个变量呢
①
namespace ns {
int g_val = 0;
}
int main() {
int g_val = 5; // 定义表
using namespace ns;
g_val = 100;
cout << "g_val = " << g_val << endl; // 100 这里找到的是局部变量int g_val = 5;
cout << "ns::g_val = " << ns::g_val << endl; // 0
}
②
此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量
namespace ns {
int g_val = 0;
}
int g_val = 5; // 全局变量,出现在 可见表
int main() {
using namespace ns;
g_val = 100;
cout << "g_val = " << g_val << endl;
cout << "ns::g_val = " << ns::g_val << endl;
}
此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量
③
此时namespace ns的 int g_val = 0; 和 全局变量 int g_val = 5;会冲突,定义了两个全局变量
namespace ns {
int g_val = 0;
}
int g_val = 5;
using namespace ns;
int main() {
g_val = 100;
cout << "g_val = " << g_val << endl;
cout << "ns::g_val = " << ns::g_val << endl;
}
3) 名字空间声明
namespace ns {
int g_val = 0;
}
int main() {
// 名字空间声明
using ns::g_val; // 从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)
g_val = 35;
cout << "g_val = " << g_val << endl; // g_val = 35
cout << "ns::g_val = " << ns::g_val << endl; // ns::g_val = 35
}
如果再定义一个局部变量,就会报重复定义的错误 重定义;多次初始化
namespace ns {
int g_val = 0;
}
int main() {
// 名字空间声明
using ns::g_val; // 从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)
int g_val = 3; // “ns::g_val”: 重定义;多次初始化 ProjectDemo0525
g_val = 35;
cout << "g_val = " << g_val << endl;
cout << "ns::g_val = " << ns::g_val << endl;
}
如果再定义一个局部变量,就会报重复定义的错误 重复声明
namespace ns {
int g_val = 0;
}
int main() {
int g_val;
// 名字空间声明
using ns::g_val; // 从这行开始,ns中的g_val引入当前作用域(相当于定义在main函数里)
g_val = 35;
cout << "g_val = " << g_val << endl;
cout << "ns::g_val = " << ns::g_val << endl;
}
题目一 下面输出什么内容? 哪个命名空间里的值?
namespace ns1 {
int m_val = 0;
int m_other = 0;
}
namespace ns2 {
int m_val = 0;
int m_other = 0;
}
int main()
{
using namespace ns1; //名字空间指令,ns1中的所有内容在当前作用域可见(可见表)
using ns2::m_val; // 名字空间声明,ns2中的m_val引入当前作用域(定义表),仅仅只有m_val出现在定义表中
m_val = 50;
cout << "ns1::m_val = " << ns1::m_val << endl; // 0
cout << "ns2::m_val = " << ns2::m_val << endl; // 50
m_other = 35;
cout << "ns1::m_other = " << ns1::m_other << endl; // 35
cout << "ns2::m_other = " << ns2::m_other << endl; // 0
}
猜对了么? 输出的是 ns2::m_val 和 ns1::m_other 有值
using namespace ns1; //名字空间指令,ns1中的所有内容在当前作用域可见(可见表)
using ns2::m_val;; //名字空间声明,ns2中的m_val引入当前作用域(定义表),仅仅只有m_val出现在定义表中
5.1 名字空间嵌套
namespace md1 {
namespace md2 {
namespace md3 {
namespace md4 {
int f = 30;
}
}
}
}
int main() {
cout << md1::md2::md3::md4::f << endl; // 30
}
名字空间别名可以简化书写
namespace md_four = md1::md2::md3::md4; cout << md_four::f << endl; // 30