目录
- 一:简单总结
- 1、作用(必背)
- 2、定义语法
- 3、三种使用方式(最重要)
- 3.1. 作用域解析符 ::(最安全、最推荐)
- 3. 2. using 声明(只开放一个成员)
- 3.3. using namespace 指令(开放整个空间)
- 4、四大特性
- 4.1可嵌套
- 4.2可合并(开放空间)
- 4.3可起别名
- 4.4匿名名称空间
- 5、标准名称空间 std
- 6、使用规范(考试 / 工程常考)
- 二、详细理解
- 1. ::作用域运算符(作用域划分)
- 2.命名空间
- 1)名称空间使用语法
- 2)名称空间只能全局范围内定义(以下错误写法)_______*
- 3)名称空间可嵌套命名空间
- 4) 名称空间是开放的,即可以随时把新的成员加入已有的命名空间中
- 5) 声明和实现可分离
- 6)无名名称空间,
- 7)名称空间别名
C++ 名称空间(Namespace)完整知识点
一:简单总结
1、作用(必背)
名称空间又称命名空间。
1.1解决名字冲突:不同模块同名函数 / 变量不打架
1.2划分作用域:让代码结构更清晰
1.3组织大型项目:按模块分类管理
2、定义语法
namespace 空间名 {
变量、函数、类、结构体……
}
示例:
namespaceA{intx=10;voidfun(){}}3、三种使用方式(最重要)
3.1. 作用域解析符 ::(最安全、最推荐)
cout<<A::x<<endl;A::fun();3. 2. using 声明(只开放一个成员)
usingA::x;cout<<x<<endl;3.3. using namespace 指令(开放整个空间)
usingnamespaceA;fun();⚠️ 注意:头文件里不要写,容易冲突。
4、四大特性
4.1可嵌套
namespaceOuter{namespaceInner{inta=10;}}// 使用:Outer::Inner::a4.2可合并(开放空间)
namespaceA{inta=1;}namespaceA{intb=2;}// 最终 A 里有 a 和 b4.3可起别名
namespaceVeryLong=A;VeryLong::x;4.4匿名名称空间
namespace{intx=100;// 只能本文件用}5、标准名称空间 std
C++ 标准库都在 std 里:
std::cout<<"hello";// 或usingnamespacestd;cout<<"hello";6、使用规范(考试 / 工程常考)
头文件 不要 写 using namespace std;
优先使用 空间名::成员
大型项目必须用名称空间划分模块
超级精简总结
作用:防冲突、分模块
访问:空间名::成员(最安全)
关键字:namespace、::、using
特性:嵌套、合并、别名、匿名
标准库:std
二、详细理解
1. ::作用域运算符(作用域划分)
通常情况下,如果有两个同名变量,一个是全局变量,另一个是局部变量,那么局部变量在其作用域内具有较高的优先权,它将屏蔽全局变量。
//全局变量inta=10;voidtest(){//局部变量inta=20;//全局a被隐藏cout<<"a:"<<a<<endl;//20}作用域运算符可以用来解决局部变量与全局变量的重名问题
//全局变量inta=10;//1. 局部变量和全局变量同名voidtest(){inta=20;//打印局部变量acout<<"局部变量a:"<<a<<endl;//10//打印全局变量acout<<"全局变量a:"<<::a<<endl;//20}这个例子可以看出,作用域运算符可以用来解决局部变量与全局变量的重名问题,即在局部变量的作用域内,可用::对被屏蔽的同名的全局变量进行访问。
总结:
两个同名变量,一个是全局变量,另一个是局部变量,可用::对被屏蔽的同名的全局变量进行访问
2.命名空间
c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。c++允许我们对名字的产生和名字的可见性进行控制。
1)名称空间使用语法
创建一个命名空间:
namespaceA{inta=10;}namespaceB{inta=20;}voidtest(){cout<<"A::a : "<<A::a<<endl;cout<<"B::a : "<<B::a<<endl;}2)名称空间只能全局范围内定义(以下错误写法)_______*
voidtest(){namespaceA{inta=10;}namespaceB{inta=20;}cout<<"A::a : "<<A::a<<endl;cout<<"B::a : "<<B::a<<endl;}3)名称空间可嵌套命名空间
namespaceA{inta=10;namespaceB{inta=20;}}voidtest(){cout<<"A::a : "<<A::a<<endl;cout<<"A::B::a : "<<A::B::a<<endl;}4) 名称空间是开放的,即可以随时把新的成员加入已有的命名空间中
namespaceA{inta=10;}namespaceA{voidfunc(){cout<<"hello namespace!"<<endl;}}voidtest(){cout<<"A::a : "<<A::a<<endl;A::func();}5) 声明和实现可分离
头文件
#pragmaoncenamespaceMySpace{voidfunc1();//函数声明,没有定义voidfunc2(intparam);}.cpp文件
voidMySpace::func1(){cout<<"MySpace::func1"<<endl;}voidMySpace::func2(intparam){cout<<"MySpace::func2 : "<<param<<endl;}6)无名名称空间,
意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static,使得其可以作为内部连接
namespace{inta=10;voidfunc(){cout<<"hello namespace"<<endl;}}voidtest(){cout<<"a : "<<a<<endl;func();}7)名称空间别名
//好像要放在cpp中,//函数定义,不能放在头文件namespaceveryLongName{inta=10;voidfunc(){cout<<"hello namespace"<<endl;}}voidtest(){namespaceshortName=veryLongName;cout<<"veryLongName::a : "<<shortName::a<<endl;veryLongName::func();shortName::func();}