双冒号作用运算符以及命名空间详解
转载地址:双冒号作用运算符以及命名空间详解,你确定不来看看吗?_敲键盘的喵的博客-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
双冒号作用运算符以及命名空间详解相关推荐
- 双冒号作用运算符以及命名空间详解,你确定不来看看吗?
文章目录 前言 一.双冒号作用域运算符 二.c++命名空间(namespace) 1.用途 2.命名空间使用语法 2.1 创建一个命名空间 2.2 命名空间只能定义为全局变量 2.3命名空间可以嵌套命 ...
- C++ 双冒号作用域运算符
本人"see小小子"学识浅薄,如有错误,请大家帮忙指出,谢谢. 一.什么是c++ C++是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼·斯特劳斯 ...
- 异步FIFO设计:各个模块的作用及Verilog代码详解
实现原理参考:异步FIFO---Verilog实现_alangaixiaoxiao的博客-CSDN博客_异步fifo 代码参考:IC基础(一):异步FIFO_MaoChuangAn的博客-CSDN博客 ...
- android 自定义xmlns,Android xmlns 的作用及其自定义实例详解
Android xmlns 的作用及其自定义实例详解 xmlns:Android="http://schemas.android.com/apk/res/android的作用是: 这个是xm ...
- python创建双链表_Python双链表原理与实现方法详解
本文实例讲述了Python双链表原理与实现方法.分享给大家供大家参考,具体如下: Python实现双链表 文章目录 Python实现双链表 单链表与双链表比较 双链表的实现 定义链表节点 初始化双链表 ...
- java中flush函数作用_Java语言中flush()函数作用及使用方法详解
最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...
- c语言 定时器作用,单片机定时器的作用及使用方法详解
单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...
- 荒岛求生html5母狼攻,荒岛求生各资源作用及获取方法详解
荒岛求生各资源作用及获取方法详解 2018-03-06 13:45:22来源:游戏下载编辑:野狐禅评论(0) 荒岛求生地图中有很多资源可以获取,它们各有什么作用呢?下面就为大家带来荒岛求生资源作用及获 ...
- c语言中常用命名空间,C语言命名空间详解.doc
C语言命名空间详解 C语言命名空间详解 C语言命名空间分析准则: 在同一命名空间.相同作用域中,任何名字须具有唯一性 每个结构和联合内部都有自己的命名空间(独立于其他空间) 结构标签.联合标签.枚举标 ...
最新文章
- JavaScript武力值飙升!用TensorFlow.js轻松实现在浏览器里搞深度学习......
- 皮一皮:高科技产品真是防不胜防...
- 一个比较牛的Js写的五子棋
- 【leetcode】Combinations (middle)
- 程序员学历要求越来越高,薪酬天花板犹如发际线,原因很简单!
- 【Keil】使用Keil5时出现的错误(持续更新)
- Sharepoint CAML 增删改查 List
- selenium+python环境搭建
- MapReduce Shuffle详解
- hplus java_Java HijrahDate plus(long, TemporalUnit)用法及代码示例
- SLM2110 600V 2A 逆变电源专用芯片替代IR2110S 移动储能解决方案
- unity 360°全景图
- 《炬丰科技-半导体工艺》集成微加工平台各向异性腐蚀
- day09---(02)课程大纲-小节添加修改删除(前端)
- 本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”
- win10系统无法连接远程服务器,笔者修复win10系统无法连接远程服务器的图文教程...
- Daily record-October
- ThinkPHP模版引擎之变量输出详解
- linux命令引用,Linux下nl命令的用法详解
- 制药业中的自然语言处理(NLP)
热门文章
- MapReduce工作笔记——Streaming输出output压缩
- 基于php033汽车俱乐部会员管理系统
- html 转译字符人民币,HTML 转义字符
- 拆书帮第14期训练营——作业六:第一周复盘
- ez usb fx2 linux,EZ-USB FX2实现图像采集系统
- mybatis笔记-04【MyBatis基于XML的详细使用——高级结果映射】
- 2020年美赛回顾与总结
- 【实用】增强WIFI信号(利用闲置无线路由器)
- 基于JAVA和MYSQL数据库实现的小型公司工资管理系统
- Patroni-2.0.0(Postgresql集群高可用方案)说明书