【C++】命名空间和using namespace std的注意事项

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 一.命名空间定义:
  • 二.为什么用命名空间
    • 1.案例引入
    • 2.执行结果分析
    • 3.补充
  • 三、命名空间的定义方式(namespace)
    • 1 .通常定义
    • 2. 嵌套定义
    • 四、命名空间的使用
      • 1.加命名空间名词和域作用限定符
      • 2.使用using将命名空间中某个成员引入
      • 3.使用using namespace 命名空间名称 引入
    • 五、using namespace std的注意事项
      • 1. using namespace std是什么
      • 2.using namespace std为什么少用

一.命名空间定义:

1.在C语言中只有一个全局作用域: 所有的全局标识符共享一个作用域 ,这使得标识符之间可能发生冲突。
2.C++中提出了命名空间的概念: 命名空间将全局作用域分成不同的部分,不同命名空间中的标识符可以同名而不会发生冲突 ,命名空间可以发生嵌套 ,全局作用域也叫默认命名空间。

二.为什么用命名空间

1.案例引入

看下面一段代码:


#include <stdio.h>
#include <string.h>int strlen = 10;
int main()
{printf("%d", strlen);return 0;
}

2.执行结果分析

执行会报错 “strlen”: 重定义

意思就是说,我们定义的变量名strlen与string.h库的strlen函数名冲突了 ,因为同一个作用域里面不能有相同的名称,但是C语言没办法解决这种问题,所以C++中引入了命名空间这个概念。

3.补充

其实还有一个原因就是当一个项目需要多个人写的时候,就难免会出现名称冲突的情况,这时候如果是C语言我们对于这种问题只能要求程序员之间去修改名称,但是如果是C++的话,我们可以用命名空间,来允许多个名称相同的情况。

三、命名空间的定义方式(namespace)

定义命名空间,需要用到namespace关键字,然后加上一个命名空间的名字,最后花括号{}括起来即可

1 .通常定义

namespace A{}

在这里插入代码片
namespace A   //A的命名空间
{int a = 20;int b = 30;...//也可以定义函数
}
namespace B //B的命名空间
{int a = 40;int b = 60;
}

2. 嵌套定义

使用方式:
namespace A{
 …
   namespace B{
      …
    }
}

在这里插入代码片
namespace N1
{int a;int b;int Add(int left, int right){return left + right;}
namespace N2//嵌套在N1中{int c;int d;int Sub(int left, int right){return left - right;}}
}

四、命名空间的使用

域作用限定符 ::使用

方式就是 作用域 ::变量名,如果作用域为空格则为在全局域中寻找变量。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
int j = 0;namespace July
{int J = 10;int U = 11;namespace July1{int L = 20;int Y = 21;}
}using namespace July;//释放July的命名空间,int main()
{printf("%d\n", July1::L);//L是嵌套在July1中的变量,printf("%d\n", J);//因为释放了July,打开了该命名空间中的所有变量,函数,方法;所以使用的是命名空间中的变量J,就不用在家作用域//printf("%d\n", July::J);就不用这么写了//如果没有Using name July ,那么,此时使用J变量是会报错,return 0;
}

1.加命名空间名词和域作用限定符

命名空间::变量

这种方式是是能在写了【命名空间::变量】这里使用,作用域最小

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
namespace July
{int J = 10;int U = 11;
}
int main()
{printf("%d\n", July::J);//看这里return 0;
}

2.使用using将命名空间中某个成员引入

这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。

使用方式:using 命名空间 ::变量

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
namespace July
{int J = 10;int U = 11;namespace July1{int L = 20;int Y = 21;}
}
using July::J;//这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。
int main()
{	printf("%d\n",J);return 0;
}```

3.使用using namespace 命名空间名称 引入

这种方式也叫全局展开,就是把命名空间中的所有变量在全局域中展开。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
namespace July
{int J = 10;int U = 11;namespace July1{int L = 20;int Y = 21;}
}
using namespace July;//释放July的命名空间,即可以直接使用里面的所有变量,函数等等
int main()
{printf("%d\n",J);printf("%d\n",U);printf("%d\n", July1:: L);printf("%d\n", July1:: Y);//可以使用全部return 0;
}

以小见大: using namespace std 也就是这样的道理,只是说std里面包含了C++标准程序库中的所有 变量,函数,对象。

五、using namespace std的注意事项

1. using namespace std是什么

1️⃣ 打开标准命名空间浅青色文字:即告诉编辑器我们将要使用名字空间std中的函数或者对象。
2️⃣using意思就是正在使用的意思。
3️⃣.namespace 在 C++ 中被提出来,用来解决 C语言 不能重定义的问题
namespace 被称为 命名空间 ,作用就是 将变量 或 函数等 规划到了不同的作用域 ,这样就起到了 将变量隔离的效果,就不用再担心会有重定义的现象发生了。
4️⃣std:是个名称空间标识符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准库中的函数或者对象都要用std来限定。

2.using namespace std为什么少用

1.标准库是不断更新的,更新后std新增的标准库命名可能会和更新前我们代码中自定义的命名冲突,所以不建议代码中直接把std全部导入,用到什么导什么,最安全。
2.使用后你的整个代码将无法使用与std标准库中的名字。不使用using namespace std就是为了 有效的防止命名冲突
3.标准库里的变量&函数非常多且命名方式不唯一,当你项目的代码量足够大时很难保证不与标准库内的命名恰好一样,我们在做项目时一般都会用自己定义的变量/函数实现一些功能,允许这些自己的东西在全局使用才是我想要的,而不是我每次使用自己的东西还要通过命名空间去取,这样反倒更影响我写代码的效率了。
以上内容仅个人学习随记,如有不对,敬请指导!
🍉 🍓 🍑 🍈 🍌 🍐 🍍 🍠 🍆 🍅 🌽

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

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

相关文章

分享一下怎么开发一个陪诊小程序

开发一个陪诊小程序需要综合考虑许多方面&#xff0c;包括但不限于市场需求、用户体验、技术实现和运营策略。以下是一篇以开发陪诊小程序为主题的文章。 一、背景介绍 随着社会的发展和人口老龄化的加剧&#xff0c;越来越多的老年人、病患和孕妇需要就医&#xff0c;而由于各…

【分布式】入门级NCCL多机并行实践 - 02

# 背景知识 大模型和分布式训练对数据的吞吐量以及并行度都有很高的要求&#xff0c;NCCL就是在这个背景下诞生的。 如果你是一个只会写写Python&#xff0c;调用PyTorch和Horovod的算法萌新&#xff0c;可能对于分布式底层的东西不太了解&#xff0c;在下岗热潮中被主管逼着…

Java并发面试题:(七)ThreadLocal原理和内存泄漏

ThreadLocal是什么&#xff1f; ThreadLocal是线程本地存储机制&#xff0c;可以将数据缓存在线程内部。ThreadLocal存储的变量在线程内共享的&#xff0c;在线程间又是隔离的。 ThreadLocal实现原理&#xff1f; ThreadLocal的底层是ThreadLocalMap&#xff0c;每个Thread都…

Open3D(C++) 最小二乘拟合平面(拉格朗日乘子法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 设拟合出的平面方程为: a x + b y + c

SpringCloud:自定义skywalking链路追踪

一、添加依赖&#xff1a; <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.7.0</version></dependency><dependency><groupId>org.apache.sk…

Mac Intellij Idea get/set方法快捷键

Control Retrun(回车键) Command n 参考&#xff1a; Mac Intellij Idea get/set方法快捷键-CSDN博客

Cornerstone for Mac:高效SVN管理的黄金标准

在当今的软件开发领域&#xff0c;版本控制系统是不可或缺的一部分。其中&#xff0c;Subversion&#xff08;SVN&#xff09;是一个广泛使用的版本控制系统&#xff0c;有助于团队协同工作&#xff0c;实现代码的版本管理和追踪。对于Mac用户来说&#xff0c;Cornerstone是一款…

【Linux】进程概念与进程状态

文章目录 一、进程概念1.进程的概念2.进程的描述-PCB 二、进程相关的基本操作1.组织进程2.查看进程3.结束进程4.通过系统调用获取进程标示符5.通过系统调用创建进程-fork初识 三、进程状态1.普遍操作系统层面的进程状态2.Linux操作系统的进程状态 四、两种特殊的进程状态1.僵尸…

C++ 01.学习C++的意义-狄泰软件学院

一些历史 UNIX操作系统诞生之初是用汇编语言编写的随着UNIX系统的发展&#xff0c;汇编语言的开发效率成为瓶颈&#xff0c;所以需要一个新的语言替代汇编语言1971年通过对B语言改良&#xff0c;使其能直接产生机器代码&#xff0c;C语言诞生UNIX使用C语言重写&#xff0c;同时…

Excel文件带有密码的只读模式,如何设置?

Excel带有密码的除了打开密码和工作表保护以外&#xff0c;其实还有一种可以设置密码的方法&#xff0c;今天给大家分享如何设置带有密码的只读模式。 打开excel文件&#xff0c;将文件进行【另存为】设置&#xff0c;然后停留在保存路径的界面中&#xff0c;我们点击下面的工…

《java 桌面软件开发》swing 以鼠标为中心放大缩小移动图片

swing 使用Graphic2D 绘制图片&#xff0c;要实现对图片进行缩放和自由拖动。 1.以鼠标所在的位置为中心&#xff0c;滚轮控制缩放 2.缩放后再支持鼠标拖动。 基本原理&#xff1a; 利用scale() 函数。进行缩放。但是要注意的地方是&#xff0c;如果是在 public void paintCom…

未来装备探索:数字孪生装备

源自&#xff1a;《计算机集成制造系统》 作者&#xff1a;陶飞 张辰源 张贺 程江峰 邹孝付 徐慧 王勇 谢兵兵 “人工智能技术与咨询” 发布 摘 要 工程装备、制造装备、医疗装备等各类装备是加快国家基础建设&#xff0c;提升国家经济实力和保障医疗健康的重要…

2023年【电工(高级)】报名考试及电工(高级)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【电工&#xff08;高级&#xff09;】报名考试及电工&#xff08;高级&#xff09;模拟考试题&#xff0c;包含电工&#xff08;高级&#xff09;报名考试答案和解析及电工&#xff08;高级&#xff09;模拟考…

JAVA基础(JAVA SE)学习笔记(六)面向对象编程(基础)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…

基于水基湍流优化的BP神经网络(分类应用) - 附代码

基于水基湍流优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于水基湍流优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.水基湍流优化BP神经网络3.1 BP神经网络参数设置3.2 水基湍流算法应用 4.测试结果…

【OpenCV实现鼠标绘图,轨迹栏做调色板,图像的基本操作】

文章目录 鼠标绘图轨迹栏做调色板图像的基本操作 鼠标绘图 在OpenCV中操作鼠标事件 函数&#xff1a;cv.setMouseCallback() 目的是在鼠标双击的地方画一个圆。首先&#xff0c;我们需要创建一个鼠标回调函数&#xff0c;该函数会在鼠标事件发生时执行。鼠标事件包括左键按下…

C++QT---QT-day3

#include "widget.h" #include "ui_widget.h" //需要在.pro文件第一行加 texttospeechWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->lineEdit->setPlaceholderText("时:分:秒");//设…

移动端1px-从基本原理到开源解决方案介绍

1px 不够准确&#xff0c;应该说成 1 物理像素 为什么有 1px 这个问题&#xff1f;实现 1px 有哪些方法&#xff1f;这些方法分别有哪些优缺点&#xff1f;开源项目中使用的哪些解决方案&#xff1f;如何在项目中处理 1px 的相关问题&#xff1f; 基本概念 首先&#xff0c;我们…

Nginx Proxy代理

代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c;可以使用多个服务器来共同分担成…

k8s集群授权prometheus(集群外部署)

一、前言 在集群外部prometheus想要调用k8s集群的apiserver获取监控数据需要通过token和ca验证&#xff0c;在集群内部部署的prometheus就不会有这个情况&#xff0c;因为集群内部部署prometheus pod的时候就已经注入了访问集群的token和ca文件&#xff0c;所以以下就针对k8s集…