接上篇:C++57个入门知识点_09_ 作用域与数据隐藏(作用域的分类、数据隐藏、不同作用域中定义了相同名称的变量,其值不是覆盖,而是存储在不同的地址下,根据作用域(从内->外)查找使用、2.1例子),本篇将介绍项目中经常使用的名字空间域,不仅在C++中其他语言也有使用,但是有不同的叫法。
总结放于前:
1.名字空间域定义: 是一种自定义作用域的方式,用于区分项目中模块和组件,主要是解决名字冲突的问题。
2.名字空间域的使用:
- 关键字
namespace
,::
用于表示作用域,有意思的称呼“四饼连接符”
- 同一作用域可以分开使用
- 名字空间域可以嵌套使用
- 名字空间可以取别名
- 名字空间内不仅可以定义变量,也可以定义函数
- 在名字作用域中可以使用全局变量
在项目中同一个变量名可能会存在于不同的作用域,如果我想使用不同作用域下的变量值该怎么去做呢?这个过程中可能出现的名字冲突,数据隐藏的问题该怎么解决呢?
现实生活中,三班有一个张三,四班也有一个张三,在班级内部喊张三,名字跟人是唯一对应的,在年级开会时,要表扬张三同学,只说名字肯定会不明确是谁,这个时候就需要加上班级信息,三班张三的第一了,四班张三得到批评了。
程序中给变量加上前缀,有前缀的修饰之后就可以准确定位到指定的变量。
1. 名字空间域定义
- 是一种自定义作用域的方式,用于区分项目中模块和组件,主要是解决名字冲突的问题。
- 名字空间域的关键字:
namespace
,::用于表示作用域,有意思的称呼“四饼连接符”
其使用的方法如下:
#include <iostream>
//ShellMad名字空间
namespace ShellMad
{
int nWidth = 6;
}
int main(int argc, char* argv[])
{
ShellMad::nWidth = 7;
return 0;
}
其中ShellMad::nWidth
就代表了ShellMad中的nWidth
。
ShellMad
作为前缀,nWidth
作为内容,::
用于表示作用域,有意思的称呼“四饼连接符”
哈哈!
当其他名字空间也有nWidth
时,可以如下去写:
#include <iostream>
//ShellMad名字空间
namespace ShellMad
{
int nWidth = 6;
}
//Ali名字空间
namespace Ali
{
int nWidth = 5;
}
int main(int argc, char* argv[])
{
ShellMad::nWidth = 7;
Ali::nWidth = 8;
return 0;
}
运行结果:不同名字空间下的nWidth对应不同的值
2.名字空间域的使用
2.1 同一作用域可以分开使用
变量只要是定义在名字作用域中,可以在不同地方定义,效果等同于声明的一个位置
。
//ShellMad名字空间
namespace ShellMad
{
int nWidth = 6;
}
namespace ShellMad
{
int nHeigh = 6;
}
int main(int argc, char* argv[])
{
ShellMad::nWidth = 7;
ShellMad::nHeigh = 7;
return 0;
}
只要在定义变量时,将变量写在namespace ShellMad{xxxx}
中,变量就处于同一个作用域中。取地址也可以看到其内存地址是相近的。
2.2 名字空间域可以嵌套使用
名字空间域的里面再定义名字空间域
。调用方式:ShellMad::ShellGame::nMoney = 400;
定义及使用如下:
#include <iostream>
//ShellMad名字空间
namespace ShellMad
{
int nWidth = 6;
//名字空间域的嵌套使用
namespace ShellGame {
int nMoney;
};
}
int main(int argc, char* argv[])
{
ShellMad::ShellGame::nMoney = 400;
return 0;
}
2.3 名字空间域可以取别名
当我们觉得现有的名字空间域的名字太复杂,想要给名字空间域的起别名可以采用如下方式:namespace newName=oldName
具体例子如下:
#include <iostream>
//ShellMad名字空间
namespace ShellMad
{
int nWidth = 6;
//名字空间域的嵌套使用
namespace ShellGame {
int nMoney;
};
}
namespace n = ShellMad;
int main(int argc, char* argv[])
{
n::ShellGame::nMoney = 300;
return 0;
}
也可以起别名起的更深一些:
定义:namespace n = ShellMad::ShellGame;
客户调用时:n::nMoney=300
2.4 名字空间域内不仅可以定义变量,也可以定义函数
#include <iostream>
//全局作用域的nWidth
int nWidth = 9;
//ShellMad名字空间
namespace ShellMad
{
int nWidth = 6;
//名字空间域的嵌套使用
namespace ShellGame {
int nMoney;
};
//名字空间域中的函数
void foo() {
nWidth = 100;
}
}
//全局总用于的nWidth
int nWidth = 9;
int main(int argc, char* argv[])
{
//名字空间域中的函数调用
ShellMad::foo();
return 0;
}
那么在void foo()
中的nWidth = 100;是全局的还是名字空间域的中nWidth
?
根据上篇的内容知道,编译器会从内向外找,那么此处的nWidth
应该是名字空间域的中的,实际运行也是如此。
2.5 在名字作用域中使用全局变量的方法
那可以在名字空间域中使用全局变量吗?答案是肯定的,具体写法如下:::nWidth = 1001;
#include <iostream>
//全局作用域的nWidth
int nWidth = 9;
//ShellMad名字空间
namespace ShellMad
{
int nWidth = 6;
//名字空间域的嵌套使用
namespace ShellGame {
int nMoney;
};
void foo() {
nWidth = 100;
//在局部表示全局作用域的表示形式
::nWidth = 1001;
}
}
int main(int argc, char* argv[])
{
//名字空间域中的函数调用
ShellMad::foo();
return 0;
}
注意:调用全局变量要在定义之后,需要将全局变量定义在最前面。
3. 学习视频地址:C++57个入门知识点_10_ 名字空间域定义及作用