转载地址:双冒号作用运算符以及命名空间详解,你确定不来看看吗?_敲键盘的喵的博客-CSDN博客

一、双冒号作用域运算符
通常情况下,如果程序中即存在局部变量又存在全局变量,局部变量将会获得较高的优先权,它将屏蔽全局变量,但双冒号作用域运算符可以解决局部变量和全局变量重名的问题,代码如下:

int atk = 200;
void test01()
{int atk = 100;cout << "攻击力为 : " << atk << endl;//双冒号 作用域运算符  ::全局作用域cout << "全局攻击力为 : " << ::atk << endl;
}

打印结果如下

攻击力为 : 100
全局攻击力为 : 200
请按任意键继续. . .

可以看到,当我们在变量前面加入::时,全局变量将会获得较高优先权。

二、c++命名空间(namespace)
1.用途
在程序中,名称(符号常量、变量、函数、结构、枚举、类和对象等等)可能会相互冲突,namespace可以通过控制各个标识符的作用域,使他们避免发生冲突。

2.命名空间使用语法
2.1 创建一个命名空间

namespace A{int a = 10;
}
namespace B{int a = 20;
}
void test(){cout << "A::a : " << A::a << endl;cout << "B::a : " << B::a << endl;
}

这样可以打印出每个命名空间中对应a的值

2.2 命名空间只能定义为全局变量
以下为错误写法

void test(){namespace A{int a = 10;}namespace B{int a = 20;}cout << "A::a : " << A::a << endl;cout << "B::a : " << B::a << endl;
}

2.3命名空间可以嵌套命名空间
代码如下

namespace A{int a = 10;namespace B{int a = 20;}
}
void test(){cout << "A::a : " << A::a << endl;cout << "A::B::a : " << A::B::a << endl;
}

2.4命名空间是开放的
命名空间是开放的,可以随时把新成员加入到命名空间中去

namespace A{int a = 10;
}namespace A{void func(){cout << "hello namespace!" << endl;}
}void test(){cout << "A::a : " << A::a << endl;A::func();
}

2.5 无命名空间
无命名空间,相当于给空间里面的标识符都加上了static,使其为内部链接,只能在本文件中使用

namespace{int a = 10;void func(){ cout << "hello namespace" << endl; }
}
void test(){cout << "a : " << a << endl;func();
}

2.6 命名空间可以起别名
我们可以随时对命名空间起别名,就好比我们的父母给我们起小名一样

namespace veryLongName{int a = 10;void func(){ cout << "hello namespace" << endl; }
}void test(){namespace shortName = veryLongName;cout << "veryLongName::a : " << shortName::a << endl;veryLongName::func();shortName::func();
}

三、using声明和using编译指令
1.using声明指定标识符
我们可以通过using声明来指定特定命名空间的标识符

namespace zxy
{int a = 10;
}void test01()
{int a = 20;//using 声明  注意避免二义性问题//写了using声明后  下面这行代码说明以后看到的a 是用zxy下的//但是  编译器又有就近原则//二义性using zxy::a;cout << a << endl;
}

该代码会发生报错,因为写了using声明后,以后编译器默认a是用 zxy下的,和编译器的局部变量就近原则产生了冲突,故程序会报错,在写代码时,我们要尽量避免二义性的发生。

using namespace std;namespace zxy
{int a = 10;
}void test01()
{int a= 20;using namespace zxy;cout << a << endl;
}

这样写将不会发生报错,using namespace zxy;只代表打开zxy这个房间,不对里面的标识符进行指定,编译器遵循就近原则。

2.using 编译指令
每次使用using都好比打开一个房间,using编译指令使整个命名空间的标识符可用.

namespace A{int paramA = 20;int paramB = 30;void funcA(){ cout << "hello funcA" << endl; }void funcB(){ cout << "hello funcB" << endl; }
}
void test01(){using namespace A;cout << paramA << endl;cout << paramB << endl;funcA();funcB();//不会产生二义性int paramA = 30;cout << paramA << endl;
}

前面说过,这样写编译器遵行就近原则,不会产生二义性,而像下面这样写则会出现问题

namespace B{int paramA = 20;int paramB = 30;void funcA(){ cout << "hello funcA" << endl; }void funcB(){ cout << "hello funcB" << endl; }
}void test02(){using namespace A;using namespace B;//二义性产生,不知道调用A还是B的paramA//cout << paramA << endl;
}

多次使用using编译指令,同时打开多个房间将会发生二义性

总结
以上就是今天要讲的内容,本文仅仅简单介绍了c++的一些基础知识,希望能给大家带来帮助。
————————————————
版权声明:本文为CSDN博主「敲键盘的喵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_59371851/article/details/124334915

双冒号作用运算符以及命名空间详解相关推荐

  1. 双冒号作用运算符以及命名空间详解,你确定不来看看吗?

    文章目录 前言 一.双冒号作用域运算符 二.c++命名空间(namespace) 1.用途 2.命名空间使用语法 2.1 创建一个命名空间 2.2 命名空间只能定义为全局变量 2.3命名空间可以嵌套命 ...

  2. C++ 双冒号作用域运算符

    本人"see小小子"学识浅薄,如有错误,请大家帮忙指出,谢谢. 一.什么是c++ C++是一种计算机高级程序设计语言,由C语言扩展升级而产生  ,最早于1979年由本贾尼·斯特劳斯 ...

  3. 异步FIFO设计:各个模块的作用及Verilog代码详解

    实现原理参考:异步FIFO---Verilog实现_alangaixiaoxiao的博客-CSDN博客_异步fifo 代码参考:IC基础(一):异步FIFO_MaoChuangAn的博客-CSDN博客 ...

  4. android 自定义xmlns,Android xmlns 的作用及其自定义实例详解

    Android xmlns 的作用及其自定义实例详解 xmlns:Android="http://schemas.android.com/apk/res/android的作用是: 这个是xm ...

  5. python创建双链表_Python双链表原理与实现方法详解

    本文实例讲述了Python双链表原理与实现方法.分享给大家供大家参考,具体如下: Python实现双链表 文章目录 Python实现双链表 单链表与双链表比较 双链表的实现 定义链表节点 初始化双链表 ...

  6. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  7. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  8. 荒岛求生html5母狼攻,荒岛求生各资源作用及获取方法详解

    荒岛求生各资源作用及获取方法详解 2018-03-06 13:45:22来源:游戏下载编辑:野狐禅评论(0) 荒岛求生地图中有很多资源可以获取,它们各有什么作用呢?下面就为大家带来荒岛求生资源作用及获 ...

  9. c语言中常用命名空间,C语言命名空间详解.doc

    C语言命名空间详解 C语言命名空间详解 C语言命名空间分析准则: 在同一命名空间.相同作用域中,任何名字须具有唯一性 每个结构和联合内部都有自己的命名空间(独立于其他空间) 结构标签.联合标签.枚举标 ...

最新文章

  1. JavaScript武力值飙升!用TensorFlow.js轻松实现在浏览器里搞深度学习......
  2. 皮一皮:高科技产品真是防不胜防...
  3. 一个比较牛的Js写的五子棋
  4. 【leetcode】Combinations (middle)
  5. 程序员学历要求越来越高,薪酬天花板犹如发际线,原因很简单!
  6. 【Keil】使用Keil5时出现的错误(持续更新)
  7. Sharepoint CAML 增删改查 List
  8. selenium+python环境搭建
  9. MapReduce Shuffle详解
  10. hplus java_Java HijrahDate plus(long, TemporalUnit)用法及代码示例
  11. SLM2110 600V 2A 逆变电源专用芯片替代IR2110S 移动储能解决方案
  12. unity 360°全景图
  13. 《炬丰科技-半导体工艺》集成微加工平台各向异性腐蚀
  14. day09---(02)课程大纲-小节添加修改删除(前端)
  15. 本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”
  16. win10系统无法连接远程服务器,笔者修复win10系统无法连接远程服务器的图文教程...
  17. Daily record-October
  18. ThinkPHP模版引擎之变量输出详解
  19. linux命令引用,Linux下nl命令的用法详解
  20. 制药业中的自然语言处理(NLP)

热门文章

  1. MapReduce工作笔记——Streaming输出output压缩
  2. 基于php033汽车俱乐部会员管理系统
  3. html 转译字符人民币,HTML 转义字符
  4. 拆书帮第14期训练营——作业六:第一周复盘
  5. ez usb fx2 linux,EZ-USB FX2实现图像采集系统
  6. mybatis笔记-04【MyBatis基于XML的详细使用——高级结果映射】
  7. 2020年美赛回顾与总结
  8. 【实用】增强WIFI信号(利用闲置无线路由器)
  9. 基于JAVA和MYSQL数据库实现的小型公司工资管理系统
  10. Patroni-2.0.0(Postgresql集群高可用方案)说明书