当前位置:网站首页>双冒号作用运算符以及命名空间详解
双冒号作用运算符以及命名空间详解
2022-07-04 18:01:00 【会飞的胖达喵】
转载地址:双冒号作用运算符以及命名空间详解,你确定不来看看吗?_敲键盘的喵的博客-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
边栏推荐
- The page element is vertically and horizontally centered, realizing the vertical and horizontal centering of known or unknown width.
- LeetCode 赎金信 C#解答
- LM10丨余弦波动顺势网格策略
- Detailed explanation of issues related to SSL certificate renewal
- 联想首次详解绿色智城数字孪生平台 破解城市双碳升级难点
- 1672. Total assets of the richest customers
- Wechat reading notes of "work, consumerism and the new poor"
- 《看完就懂系列》字符串截取方法substr() 、 slice() 和 substring()之间的区别和用法
- Technologie de base de la programmation Shell IV
- In flinksql, in addition to data statistics, is the saved data itself a state
猜你喜欢
Introduction to polyfit software
读写关闭的channel是啥后果?
牛客小白月赛7 谁是神箭手
Lm10 cosine wave homeopathic grid strategy
Upgrade the smart switch, how much is the difference between the "zero fire version" and "single fire" wiring methods?
Safer, smarter and more refined, Chang'an Lumin Wanmei Hongguang Mini EV?
Bi skills - permission axis
勾股数规律(任意三个数能够满足勾股定理需要满足的条件)
联想首次详解绿色智城数字孪生平台 破解城市双碳升级难点
欧拉函数
随机推荐
1002. A+B for Polynomials (25)(PAT甲级)
Generate XML elements
YOLOv5s-ShuffleNetV2
redis分布式锁的8大坑总结梳理
Leetcode ransom letter C # answer
How test engineers "attack the city" (Part 2)
牛客小白月赛7 I 新建 Microsoft Office Word 文档
2022CoCa: Contrastive Captioners are Image-Text Fountion Models
Online text line fixed length fill tool
用实际例子详细探究OpenCV的轮廓绘制函数drawContours()
OpenCV的二值化处理函数threshold()详解
SSRS筛选器的IN运算(即包含于)用法
Pointnet/Pointnet++点云数据集处理并训练
. Net ORM framework hisql practice - Chapter 2 - using hisql to realize menu management (add, delete, modify and check)
2021 Hefei informatics competition primary school group
How to use async Awati asynchronous task processing instead of backgroundworker?
To sort out messy header files, I use include what you use
使用canal配合rocketmq监听mysql的binlog日志
Safer, smarter and more refined, Chang'an Lumin Wanmei Hongguang Mini EV?
sqlserver的CDC第一次查询的能读取到数据,但后面增删改读取不到,是什么原因