详细了解C++中的namespace命名空间

键盘敲烂,月薪过万,同学们,加油呀!

目录

键盘敲烂,月薪过万,同学们,加油呀!

  一、命名空间的理解

二、::作用域运算符

三、命名空间(namespace)

3.1、namespace的由来

3.2、命名空间使用语法

3.3、using声明

3.4、using编译指令


 

  一、命名空间的理解

同学们好!今天王老师来带大家了解C++中的命名空间(namespace)的一个概念。首先要了解什么是命名空间,这个大家就可以把它理解成一个工具箱,如下图:

众所周知,我们C++一般用在大型项目中,现在假设我们一共有张三,李四,王五三个人完成一个大型项目, 因为项目太大了,所以我们在创建变量的时候就有很大的概率会造成变量名相同的一个问题,这个时候就会发生命名冲突的一个问题了,这个时候怎么办呢?这时我们就可以用到C++中的命名空间了,这个就像把我们所创建好的东西放入一个工具箱中,但是这个工具箱有好多个,每个工具箱中有个别工具是相同的(外貌相同,并不是同一个),这个时候我们需要用到哪个工具箱中的工具我们就去哪个工具箱中拿,这样就能解决命名冲突的一个问题了,这也是命名空间最大的一个用处。

比如上图中,我们如果需要用到A空间中的a我们就去A中拿,要用到B中的a我们就去B中拿,这样编译器就不会不知道我要用的这个变量是来自于哪里了。

二、::作用域运算符

在正式了解命名空间之前我们还需要了解::作用域运算符。

通常情况下,如果有两个同名变量,一个全局变量,一个局部变量,那么局部变量在其作用域范围内有更高的优先级,它将屏蔽全局变量。

如下代码:

int a = 10;
void fun(void)
{int a = 20;cout<<a<<endl;    
}

程序的输出结果是:

a = 20 

在这个fun函数中,cout输出语句使用的变量a是fun函数中内部定义的局部变量a,因此输出的结果为局部变量a 的值。在C语言中,我们无法解决这个问题,无法在fun函数中访问到全局变量a,但是在C++中我们可以用作用域运算符解决这个变量重名问题。

代码如下:

//全局变量
int a = 10;
//1. 局部变量和全局变量同名
void test(){
int a = 20;
//打印局部变量 a
cout << "局部变量 a:" << a << endl;
//打印全局变量 a
cout << "全局变量 a:" << ::a << endl;
}
从这个例子可以看出,作用域运算符可以解决局部变量与全局变量的重名问题,即在局部变量的作用域中,可用::对被屏蔽的同名的全局变量进行访问。

三、命名空间(namespace)

3.1、namespace的由来

在C++中,我们在好多地方都需要命名,比如说结构体、常量、变量、函数、枚举、类和对象等等,我们都需要去给它们取个名字。工程越大,名称互相冲突的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突,为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间),可以更好地控制标识符的作用域

3.2、命名空间使用语法

创建一个命名空间:

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

命名空间只能全局范围内定义(以下写法错误)

//错误写法
void test(){namespace A{int a = 10;}cout<<"A::a"<<A::a<<endl;
}

命名空间可以嵌套命名空间

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;
}

命名空间是开放的,即可以随时把新的成员加入已有的命名空间中: 

 

namespace A {int a = 100;int b = 200;
}
//将c添加到已有的命名空间A中
namespace A {int c = 300;
}void test04()
{cout<<"A中a = "<<A::a<<endl;//100cout<<"A中c = "<<A::c<<endl;//200
}

函数的声明和实现可以分离

namespace A {int a=100;//变量void func();
}void A::func()//成员函数 在外部定义的时候 记得加作用域
{//访问命名空间的数据不用加作用域cout<<"func遍历a = "<<a<<endl;
}

无名的命名空间,意味着命名空间中的标识符只能在本文件中访问,相当于给这个标识符加上了static,使得其可以作为内部连接(了解)

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

命名空间取别名(了解)

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();
}

3.3、using声明

using声明可以使得指定的标识符可用

namespace A{int paramA = 20;int paramB = 30;void funcA(){ cout << "hello funcA" << endl; }void funcB(){ cout << "hello funcA" << endl; }
}
void test(){//1. 通过命名空间域运算符cout << A::paramA << endl;A::funcA();//2. using 声明using A::paramA;using A::funcA;cout << paramA << endl;//cout << paramB << endl; //不可直接访问funcA();//3. 同名冲突//int paramA = 20; //相同作用域注意同名冲突
}

using声明碰到函数重载

namespace A{void func(){}void func(int x){}int func(int x,int y){}
}
void test(){using A::func;func();func(10);func(10, 20);
}

如果命名空间包含一组用相同名字重载的函数,using声明就声明了这个重载函数的所有集合

3.4、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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505250.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双周回顾#007 - 前端与后端

前端的问题不是难&#xff0c;而是它面对最终用户。只要用户的喜好和口味发生变化&#xff0c;前端就必须跟上。 这导致前端不得不快速变化&#xff0c;因为用户的口味正在越来越快地改变。 后端不需要面对最终用户&#xff0c;需要解决的都是一些经典的计算机科学问题&#…

第16章-DNS

目录 1. 域名 1.1 产生背景 1.2 概述 1.3 域名的树形层次化结构 2. DNS 2.1 概述 2.2 工作机制 3. DNS查询模式 3.1 递归查询&#xff1a; 3.2 迭代查询&#xff1a; 4. 相关知识点 4.1 集中式DNS 4.2 国内通用DNS 4.3 配置DNS代理 1. 域名 1.1 产生背景 ① IP…

DataIntegrityViolationException异常产生原因及解决方案

DataIntegrityViolationException异常产生原因及解决方案 01 异常的发生场景 在我新写了一个接口之后出现的 //org.springframework.dao.DataIntegrityViolationException日志报错的意思是参数设置了一个错误的值 02 异常的产生及其原因 我最开始认为是MySQL数据库表设计…

JMeter性能测试基本过程及示例

jmeter 为性能测试提供了一下特色&#xff1a; jmeter 可以对测试静态资源&#xff08;例如 js、html 等&#xff09;以及动态资源&#xff08;例如 php、jsp、ajax 等等&#xff09;进行性能测试 jmeter 可以挖掘出系统最大能处理的并发用户数 jmeter 提供了一系列各种形式的…

Acwing 每日一题 空调 差分 贪心

&#x1f468;‍&#x1f3eb; 空调 &#x1f468;‍&#x1f3eb; 参考题解 import java.util.Scanner;public class Main {static int N (int) 1e5 10;static int[] a new int[N];static int n;public static void main(String[] args){Scanner sc new Scanner(System.…

07 编译器

目录 编译过程编译器查看详解函数库自动化构建工具进度条程序 1. 编译过程 预处理: a. 去注释 b.宏替换 c.头文件展开 d.条件编译 编译: 汇编 汇编: 可重定向二进制目标文件 链接: 链接多个.o, .obj合并形成一个可执行exe gcc编译c程序, g编译c程序 2. 编译器查看 输入gcc …

ABAP - SALV教程04 添加状态栏

CL_SALV_TABLE中提供了 GET_FUNCTIONS方法.GET_FUNCTIONS方法返回的是一个CL_SALV_FUNCTIONS_LIST类型的实例对象. 类CL_SALV_FUNCTIONS_LIST两个方法(SET_ALL、SET_DEFAULT)可以添加标准状态栏 实现步骤: 定义SET_STATUS私有方法. PRIVATE SECTION.METHODS:set_status CHA…

Revit-二开之创建墙-(6)

Revit API窗间墙 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements) {try{// 获取当前活动的文档

qsort使用

qsort 是用来排序的数据的库函数,底层使用的是快速排序的方式 排序方式有:选择,冒泡,插入,快速, 希尔...... 对于qsort这个库函数: void qsort(void* base,size_t num,size_t size,int (*compar)(const void*,const void*) 其中 void* base 是指针,指向的是待排序的数组的第…

Unity 向量计算、欧拉角与四元数转换、输出文本、告警、错误、修改时间、定时器、路径、

using System.Collections; using System.Collections.Generic; using UnityEngine;public class c2 : MonoBehaviour {// 定时器float t1 0;void Start(){// 向量Vector3 v1 new Vector3(0, 0, 2);Vector3 v2 new Vector3(0, 0, 3);// 计算两个向量的夹角Debug.Log(Vector3…

基于java+springboot女士电商平台系统源码+文档设计

基于javaspringboot女士电商平台系统源码文档设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

光伏业务管理软件都有哪些?

随着光伏行业的快速发展&#xff0c;光伏业务管理软件在光伏企业的日常运营和管理中扮演着越来越重要的角色。这些软件不仅提高了光伏企业的运营效率&#xff0c;还帮助企业更好地管理项目、优化资源配置、降低成本并提升市场竞争力。本文将介绍一些常见的光伏业务管理软件&…