c++ 名称空间

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

更多文章