当前位置: 首页 > news >正文

【C++课程学习】:命名空间的理解(图文详解)

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

📷1.命名冲突

📷2.重定义

📷3.命名空间

🍺命名空间可以嵌套:

🍺可以定义一样名字的命名空间

🍺命名空间的两种展开方式:


前言:
已经学了几天的C++,现在来把知识点梳理一下。C++和C语言差别很大,在很多方面比C语言做的更好,所以我再次感谢C++之父本贾尼博士。然后今天现来看看他在C语言上改善的一个小点。

📷1.命名冲突

本贾尼博士在用C语言的时候,可能就遇到这样的问题。他与几个同事一起写一个大型的程序,然后他们把这大型的程序分成几个部分,每个人完成一部分,然后再把代码放在一起,进行运行。结果就报错了,这里面可能有一点就是他们几个人都定义了一样的变量,这样编译器就找不到要用哪个变量。或者定义了很多函数,但是有两个人的函数名字是一样的,这样又会发生错误。所以他们就只能去改名字。这样其实也是很麻烦的,所以本贾尼博士就在C++中引入了一个新的概念:命名空间。

📷2.重定义

正常去查找变量的顺序是:

1.先在所在的局部域进行查找。

2.在全局域进行查找。

注意:在没有展开指定域的情况下,是不去该域查找的。

理解:

1.打印rand的时候,先在局部域中查找rand,然后就找到了,就输出100,这没问题。

2.打印rand的时候,在局部域找了一下,没有找到,然后又去局部域找,然后也找到了,这也没问题。

3.引入rand函数的头文件:include<stdlib.h>以后,把rand放在局部,然后运行没什么问题,还是能找到,也没有重定义。

4.当引入rand函数的头文件,全局域本来就有一个rand函数,然后又把rand变量定义在全局。这样编译器就不知道找哪个了。


🌹🌹🌹下面的这个代码也就证明了,没有其他操作情况下,编译器是不会去命名空间里找的。

要想让编译器去命名空间里找,这里有两种方法:

1.在a前面加上所在的命名空间。

2.展开a所在的命名空间。using namespace 命名空间名;

我刚刚在试的时候,就把using namespace ku;放在了命名空间的前面,就编不过去,害我找了几分钟,才知道的要把using namespace ku;放在命名空间的前面。所以老铁们,注意一下。

📷3.命名空间

从上面的例子我就已经看到命名空间了:
 

#include<iostream>//ku是命名空间的名字
namespace ku {int a = 100;
}int main()
{//前面的是在std域中找cont//后面的是在ku域中找astd::cout << ku::a ;return 0;
}

🍺命名空间可以嵌套:

查找的时候就去一个一个域中找,如下:

展开命名空间如下:

using namespace A::B;

#include<iostream>//A命名空间里嵌套有B命名空间
namespace A {namespace B {int k = 0;}
}int main()
{//A::B::k查找k的结构std::cout << A::B::k ;return 0;
}

🍺可以定义一样名字的命名空间

当定义同样的命名空间,编译器会把名字一样的命名空间进行合并。

#include<iostream>//编译器会合并这两个命名空间
namespace A {int p = 88;
}namespace A {int a=99;
}
using namespace A;
int main()
{std::cout << A::a << " " << A::p<<std::endl;return 0;
}

🍺命名空间的两种展开方式:

1.全展开:
using namespace std;就是展开std命名空间里的所以东西,包括cout,cin,endl

2.部分展开:

using std::cout;就是只展开std里面的cout。

注意:全展开会有很多命名已经存在,不太适合用在项目里面,在平时练习的时候还是可以用的。

#include<iostream>
using namespace std;int main()
{cout << "Hello World" << endl;return 0;
}
#include<iostream>
using std::cout;//只展开std里面的coutint main()
{cout << "Hello World";return 0;
}

注意点:
1.有了命名空间,就算有很多个重复的变量名,函数名,都是没关系的,只要这些在不同的域中间。所以我们写项目的时候,每个人都定义一个自己的命名空间,这样就不会出现命名重复的问题了。

2.命名空间的定义是全局的。

3.域解析操作符(::)。

4.命名空间可以定义函数/变量/类型。

相关文章:

  • i2c总线介绍
  • 文心智能体大赛:百度文心智能体平台初体验
  • 基于webpack+Vue3+JavaScript+antd+less+axios技术栈实现所有组件全局自动化注册
  • [JDK工具-5] jinfo jvm配置信息工具
  • 自从有了可观测性,传统运维如何进行提升?
  • Flutter 中的 ClipRect 小部件:全面指南
  • springBoot项目中的static和templates文件夹
  • SQL约束
  • docker命令详解大全
  • JVM学习-Class文件结构②
  • AGI系列(1):掌握AI大模型提示词优化术,提问准确率飙升秘籍
  • 2024最新 Jenkins + Docker实战教程(一) - Jenkins介绍及安装
  • Android 多语言
  • 揭秘C++ String容器:字符串操作的艺术
  • php正则中的i,m,s,x,e分别表示什么
  • happypack两次报错的问题
  • Invalidate和postInvalidate的区别
  • Java读取Properties文件的六种方法
  • JS字符串转数字方法总结
  • linux安装openssl、swoole等扩展的具体步骤
  • linux学习笔记
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue.js源码(2):初探List Rendering
  • 编写高质量JavaScript代码之并发
  • 从setTimeout-setInterval看JS线程
  • 动态规划入门(以爬楼梯为例)
  • 警报:线上事故之CountDownLatch的威力
  • 理清楚Vue的结构
  • 使用Gradle第一次构建Java程序
  • 通过npm或yarn自动生成vue组件
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • Linux权限管理(week1_day5)--技术流ken
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #宝哥教你#查看jquery绑定的事件函数
  • %@ page import=%的用法
  • (13)Hive调优——动态分区导致的小文件问题
  • (175)FPGA门控时钟技术
  • (C++)八皇后问题
  • (C++17) std算法之执行策略 execution
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (阿里云万网)-域名注册购买实名流程
  • (二十四)Flask之flask-session组件
  • (算法)求1到1亿间的质数或素数
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • ****Linux下Mysql的安装和配置
  • .describe() python_Python-Win32com-Excel
  • .Net 8.0 新的变化
  • .NET C# 使用 iText 生成PDF
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net mvc部分视图
  • .net 程序发生了一个不可捕获的异常