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

【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.标准库里的变量&函数非常多且命名方式不唯一,当你项目的代码量足够大时很难保证不与标准库内的命名恰好一样,我们在做项目时一般都会用自己定义的变量/函数实现一些功能,允许这些自己的东西在全局使用才是我想要的,而不是我每次使用自己的东西还要通过命名空间去取,这样反倒更影响我写代码的效率了。
以上内容仅个人学习随记,如有不对,敬请指导!
🍉 🍓 🍑 🍈 🍌 🍐 🍍 🍠 🍆 🍅 🌽

相关文章:

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

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

修改51单片机中数组元素的值

在8051单片机中&#xff0c;code关键字用于将数据存储在ROM中。由于ROM是只读的&#xff0c;所以在运行时无法直接修改seven_seg数组中的值。 如果您想在main函数中修改seven_seg[1]的值为0xc0&#xff0c;您可以将seven_seg数组定义为可写的变量&#xff0c;而不是存储在ROM中…...

Ruby和面向对象技术

Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言&#xff0c;每个对象都是一个样例或者既定类的实例以及独立对象的行为。 一、创建一个通用对象 创建一个通用对象 obj Object.new定义通用对象的行为 def obj.talk puts "I am an object"p…...

C++11常用新特性——可变参数模板

可变参数模板 C11中&#xff0c;可变参数模板是一个非常强大的特性&#xff0c;它允许函数和类模板接受任意数量和类型的参数&#xff0c;这为类型的安全编程提供了更广泛的灵活性。下面我将详细介绍这一新特性。 基础概念&#xff1a; 可变参数模板允许你传递多个类型和数量…...

SpringCloud-Seata

一、介绍 &#xff08;1&#xff09;实现分布式事务 &#xff08;2&#xff09;解决Spring只支持单机事务 &#xff08;3&#xff09;事务ID TC&#xff08;事务协调者&#xff09; TM&#xff08;事务管理者&#xff09; RM&#xff08;资源管理者&#xff09;...

java击球小游戏运行代码

创建一个图形化的小游戏通常需要使用Java图形库&#xff0c;例如Swing或JavaFX。下面是一个使用JavaFX创建的简单的图形化小游戏示例&#xff0c;其中一个小球会在窗口内移动&#xff0c;你需要点击小球以增加得分&#xff1a; import javafx.application.Application; import…...

Hadoop面试题+详解

20道面试题及详细解答&#xff01; 1.说说什么是结构化数据、非结构化数据和半结构化数据 结构化数据、非结构化数据和半结构化数据是根据数据的组织结构和格式来划分的不同类型的数据。 结构化数据&#xff1a;结构化数据是按照预定义的数据模型进行组织和存储的数据。它通常…...

PDF编辑阅读:Acrobat Pro DC 2021中文稳定版

Acrobat Pro DC 2021是一款专业的PDF编辑和阅读软件。它可以创建、编辑、组合、签署和分享PDF文件&#xff0c;提供了许多强大的功能&#xff0c;如PDF文件转换、OCR识别、PDF文件合并、加密和解密等等。Acrobat Pro DC 2021的界面简单直观&#xff0c;易于使用&#xff0c;而且…...

单词规律(C++解法)

题目 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern "abba", s …...

MySQL 主从复制原理

文章目录 1.主从复制方式1.1 异步复制1.2 半同步复制1.3 全同步复制 2.主从复制原理3.主从复制时推还是拉&#xff1f;参考文献 主从复制是 MySQL 高可用&#xff08;备份&#xff09;和高性能&#xff08;读写分离&#xff09;的基础&#xff0c;有了这个基础&#xff0c;MySQ…...

构建嵌入式Linux rootfs根文件系统

创建根文件系统涉及选择系统运行所需的文件。在本节中&#xff0c;我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。 转载请注明来源&#xff0c;谢谢。构建嵌入式Linux rootfs根文件系统-CSDN博客创建根文件系…...

高速电路设计----第三章

一、数字信号需要上拉的情况 1、 一般信号上拉接多大的电阻要看对于芯片的电流要求。看芯片datasheet的I(BHLO)和I&#xff08;BHHO&#xff09;两个参数。平时的话: 3.3V的上拉为1K~3.3k即可 5V的上拉电阻为4.7K到10K即可。 2、数字信号的逻辑控制&a…...

【微信小程序】6天精准入门(第4天:自定义组件及案例界面)附源码

一、自定义组件 1、介绍 从小程序基础库版本 1.6.3 开始&#xff0c;小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以便在不同的页面中重复使用&#xff1b;也可以将复杂的页…...

pragma once与ifndef的区别

概要 代码编译过程中&#xff0c;为了防止同一份代码被重复引用&#xff0c;通常有两种实现方式 方式一 #pragma once 方式二 #ifndef _TEST_H_ #define _TEST_H_ #endif // !TEST_H 通常情况下&#xff0c;使用上述两种方式中的任意一种都是可以的。最近工作中&#xff0c;代…...

52单片机独立键盘控制数码管计数

前言 使用52单片机实现独立键盘控制数码管计数 代码 #include<reg52.h> #define uchar unsigned char #define uint unsigned intsbit key2 P3^4; sbit key3 P3^5; sbit key4 P3^6; sbit key5 P3^7;char code smg[] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x…...

完美解决 在将最终稿件上传到 IEEE PDF eXpress进行格式检查是出现“font not embedded“的问题 (不会出现自动压缩图像的现象)

最近中了一篇IEEE的论文&#xff0c;在校稿阶段&#xff0c;final paper是需要通过IEEE PDF eXpress网站的格式检查&#xff0c;然后出现一下问题&#xff1a; Errors: Font TimesNewRomanPS-BoldMT, TimesNewRomanPS-ItalicMT, TimesNewRomanPSMT is not embedded 用人话说就…...

零基础学习CSS

01-CSS初体验 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09;。 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签…...

基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(五)FineBI可视化

文章目录 22&#xff1a;FineBI配置数据集23&#xff1a;FineBI构建报表24&#xff1a;FineBI实时配置测试附录二&#xff1a;离线消费者完整代码 22&#xff1a;FineBI配置数据集 目标&#xff1a;实现FineBI访问MySQL结果数据集的配置 实施 安装FineBI 参考《FineBI Windows…...

Python逆向爬虫案例: 某网站AES逆向解密

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0…...

ONNX runtime本地终端部署

1、class_index.csv文件&#xff1a; ID,English,Chinese 0,A,你 1,B,我 2,C,他 3,D,她2、classification.onnx 3、单张图像处理代码如下&#xff1a; import onnxruntime import torch import torch.nn.functional as F import pandas as pd from PIL import Image from tor…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...