【C++】命名空间(namespace) 以及理解using namespace std

news2024/9/25 15:25:39

命名空间

  • 1.命名空间使用的背景
    • 1.背景
  • 2.命名空间的定义(namespace)
    • 2.1正常的定义
    • 2.2 命名空间可以嵌套定义
    • 2.3允许命名空间相同
  • 3.域作用限定符(::)和命名空间的使用
    • 3.1域作用限定符(::)
    • 3.2 命名空间的使用
      • 3.2.1 加命名空间名词和域作用限定符
      • 3.2.2 使用using将命名空间中某个成员引入
      • 3.3 使用using namespace 命名空间名称 引入
  • 4.理解using namespace std以及为什么尽量使用局部展开
  • 5.总结

1.命名空间使用的背景

1.背景

我们先来看以下这段代码

#include <stdio.h>
#include <string.h>

int strlen = 10;
int main()
{
	printf("%d", strlen);
	return 0;
}

这段代码会报以下错误:

“strlen”: 重定义;以前的定义是“函数”

意思就是说,我们定义的变量名strlen与string.h库的strlen函数名冲突了,因为同一个作用域里面不能有相同的名称,但是C语言没办法解决这种问题,所以C++中引入了命名空间这个概念。
其实还有一个原因就是当一个项目需要多个人写的时候,就难免会出现名称相同的情况,这时候如果是C语言我们对于这种问题只能要求程序员之间去修改名称,但是如果是C++的话,我们可以用命名空间,来允许多个名称相同的情况。

2.命名空间的定义(namespace)

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

2.1正常的定义

namespace A   //A的命名空间
{
	int a = 20;
	int b = 30;
	...//也可以定义函数
}
namespace B //B的命名空间
{
	int a = 40;
	int b = 60;
}

2.2 命名空间可以嵌套定义

namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
	{
     	return left + right;
 	}
namespace N2
 {
    int c;
    int d;
    int Sub(int left, int right)
    {
         return left - right;
    }
 }
}

2.3允许命名空间相同

当多个命名空间相同时,实际上会合成一个命名空间。

3.域作用限定符(::)和命名空间的使用

3.1域作用限定符(::)

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

//我们知道,当一个变量有在全局域中存在,也在局部中存在,会优先使用局部的变量。
//这时候如果我们就想用全局变量就要加上域作用限定符::
//如下:前面为空格表示全局变量。
int i = 20;//全局变量
int main()
{
	int i = 10;
	printf("%d", i);//局部变量,10
	printf("%d", ::i);//20
	return 0;
}

3.2 命名空间的使用

我们以下用命名空间的代码放在我们自己的test.h头文件中

namespace A  //A的命名空间
{
	int a = 20;
	int b = 30;
}
namespace B  //B的命名空间
{
	int a = 40;
	int b = 60;
}

在这里插入图片描述

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

命名空间名称 + :: + 变量
#include "test.h"

int main()
{
	printf("%d", A::a); //20
	printf("%d", B::a);// 40
	return 0;
}

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

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

using A::a;
int main()
{
	printf("%d", a); //20
	printf("%d", B::a);// 40
	return 0;
}

3.3 使用using namespace 命名空间名称 引入

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

using namespace A;
int main()
{
	printf("%d", a); //20
	printf("%d", b);//30
	printf("%d", B::a);// 40
	return 0;
}

4.理解using namespace std以及为什么尽量使用局部展开

由上面的知识我们可以知道,using namespace std,就是利用using 将 std 全局展开,而std就是我们的standard,就是C++标准库。
因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。 所以就有了和<iostream.h>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。 iostream和iostream.h,前者没有后缀。实际上,在你的编译器include文件夹里面可以看到,二者是两个文件。打开文件就会发现,里面的代码是不一样的。 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因 此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;命名空间std封装的是标准程序库的名称。

这是一段C++代码

写法1#include <iostream>

using namespace std;//全局展开
int main()
{
	cout << "hello world" << endl;
	return 0;
}
写法2#include <iostream>

using std::cout;//局部展开
using std::endl;
int main()
{
	cout << "hello world" << endl;
	return 0;
}
写法3#include <iostream>

int main()
{
	std::cout << "hello world" << std::endl;//指定命名空间
	return 0;
}
在进行工程项目时,我们不建议将std全局展开,而是采用局部展开,或者指定命名空间访问。
之所以在进行工程项目时不建议将std全局展开,主要是为了防止命名冲突。
比如我正在使用两个库
using namespace A;
using namespace B;
不管是调用A里面的函数add(),还是B里面的函数sub(),都是可以的。
但是如果有一天,我的A库要升级的话,里边新加了一个函数叫sub,这样就出现问题了,因为它和命名空间B里的sub冲突了。那我是不是要一个一个去解决,费时费力。
如果我当初没有全局展开这些名称,而是A::add(),B::sub(),A::sub(),那就没有命名冲突的问题了。
所以不建议全局导入命名空间,而是要用哪个就显示哪个命名空间,这样代码本身的阅读性也好。

5.总结

命名空间namespace:定义方式namespace + {},正常定义,也可以嵌套定义(自然可以嵌套使用,如A::B::i),以及相同的名字的命名空间会合到一起。
using使用命名空间
域作用限定符::配合命名空间名称使用
三种使用命名空间方式:全局展开,局部展开,指定
最重要的是在进行工程项目时最好不要用全局展开,防止命名冲突,

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

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

相关文章

【nodejs】模块化

一、概念 1、模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&#xff0c;把一个大文件拆成独立并相互依赖的多个小模块 把代码进行模块化拆分的好处&#xff1a; 1、提高代码的复用性 2、提高代码的可维护性 3、可以实现按需加载 2、模块化规范 对代码进行模块化…

《CSS新世界》读书笔记

前言 本文为《CSS新世界》的读书笔记。推荐去读原著。 《CSS新世界》微信读书APP链接&#xff1a;CSS新世界-张鑫旭-微信读书 (qq.com) 1. 尺寸属性值&#xff1a;fit-content 描述 fit-content 不是一个属性&#xff0c;它是 css 尺寸系列属性的一个新属性值。可用在 wid…

lammps教程:旋转模型的技巧

大家好&#xff0c;我是小马老师。 本文介绍lammps翻转模型的方法。 在进行分子动力学模拟时&#xff0c;可能需要特定的面位于设定的方向。 如Al2O3的力学性能模拟中&#xff0c;需要分别对A、B、C面进行压痕或者摩擦模拟。 按照研究界面垂直z轴&#xff0c;并且面法线沿着z轴…

转转测试环境治理的高效能实践

文章目录1. 背景及需求1.1 系统架构的发展1.2 测试环境的需求2. 传统的测试环境解决方案-物理隔离3. 转转测试环境V1-改进的物理隔离3.1 稳定环境3.2 动态环境3.3 优缺点3.3.1 优点3.3.2 缺点4. 转转测试环境V2-基于自动IP标签的流量路由5. 转转测试环境V3-基于手动标签的流量路…

大数据挖掘-伤寒论和金匮要略(COVID-19用药启示录,1.4万字收藏)

来自Toby老师&#xff0c;大数据挖掘-伤寒论和金匮要略 大家好&#xff0c;我是Toby老师&#xff0c;三年来新冠病毒肆虐全球&#xff0c;带来一些列症状&#xff0c;例如发热&#xff0c;恶寒&#xff0c;咳嗽&#xff0c;咽喉痛&#xff0c;腹泻&#xff0c;心脑血管疾病等…

C语言_动态内存管理

目录 1. 为什么存在动态内存管理 2. 动态内存函数介绍 2.1 开辟内存块函数_malloc 2.2 动态内存释放和回收函数_free 2.3 开辟空间初始化元素为0的函数_calloc 2.4 调整动态内存开辟大小的函数_realloc 3. 常见的动态内存错误 3.1 对NULL进行解引用操作 3.2 对动态开辟…

aloam学习笔记(二)

学习aloam框架中前端对于点云部分的预处理和点面特征提取。 这些功能在scanRegistration.cpp部分实现&#xff0c;所以也是对于这个源码的学习。 一、main函数 从main函数开始分析。 首先整个完整的main函数内容&#xff1a; int main(int argc, char **argv) {ros::init(…

RSA、MD5加密解密算法全套解析安装教程

第一部分介绍加密解密算法&#xff0c; 第二部分介绍我小组成功应用的RSA、MD5两种加密解密算法&#xff0c;以及心得体会。 1、加密解密算法介绍 应用的开发中安全很重要&#xff0c;所以信息加密技术显得尤为重要。我们需要对应用中的多项数据进行加密处理&#xff0c;从而来…

(人工智能的数学基础)第一章特征向量与矩阵分析——第三节:特征向量与特征值

参考 3Blue1Brown系列&#xff1a;特征向量和特征值第十章 线性代数之 特征向量与特征值】3Blue1Brown知乎&#xff1a;线性代数的本质10 特征向量和特征值 文章目录一&#xff1a;特征向量与特征值概念引入二&#xff1a;特征向量与特征值概念求解三&#xff1a;特征向量与特…

谷粒学院——第七章、课程分类管理

EasyExcel 介绍 简介 Excel导入导出的应用场景 1、数据导入:减轻录入工作量 2、数据导出:统计信息归档 3、数据传输:异构系统之间数据传输 EasyExcel的特点 Java 领域解析、生成 Excel 比较有名的框架有 Apache poi、jxl 等。但他们都存在一个严重的问题就是非常的耗内存。…

Python数据分析三剑客之Pandas

写在前面的话&#xff1a; 开始之前请确保已经配置好python环境&#xff0c;并安装好第三方库pandas和numpy。 1. pandas库介绍 什么是pandas&#xff1f;pandas是提供高性能易用数据类型和数据分析工具的第三方库。简单讲&#xff0c;pandas主要作用有两个&#xff1a;提供了…

电子学会2020年6月青少年软件编程(图形化)等级考试试卷(二级)答案解析

目录 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题&#xff08;共3题&#xff0c;共30分&#xff09; 青少年软件编程&#xff08;Scratch&…

谷粒学院——第八章、课程管理

一、课程添加功能 概览 课程添加的步骤 课程相关表的关系 后端实现 1、代码生成器 只修改表名即可&#xff0c;依次填入&#xff1a;“edu_course”, “edu_course_description”, “edu_chapter”, “edu_video” 生成完成后&#xff0c; 删除EduCourseDescriptionContr…

力扣 1801. 积压订单中的订单总数

题目 给你一个二维整数数组 orders &#xff0c;其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种&#xff1a; 0 表示这是一批采购订单 buy 1 表示这是一批销售订单 sel…

学习疑惑:用什么方法进行产品原型设计

对于在互联网行业的各位来讲&#xff0c;应该很清楚原型设计在应用开发中的重要性。它所起到的不仅是沟通的作用&#xff0c;更有体现之效。通过内容和结构展示&#xff0c;以及粗略布局&#xff0c;能够说明用户将如何与产品进行交互&#xff0c;体现开发者及UI设计师的idea&a…

pytorch拼接函数:torch.stack()和torch.cat()详解

在pytorch中&#xff0c;常见的拼接函数主要是两个&#xff0c;分别是&#xff1a;stack()和cat()。 torch.stack()函数的意义&#xff1a;使用stack可以保留两个信息&#xff1a;[1. 序列] 和 [2. 张量矩阵] 信息&#xff0c;属于【扩张再拼接】的函数。 形象的理解&#xff…

谷粒学院——第十二章、Banner轮播图

Banner微服务 配置 Nginx 修改文件&#xff1a;nginx.conf 修改完后&#xff0c;重启 nginx nginx -s reload创建项目和初始化 1、新建模块 service_cms 2、配置文件和启动类 创建配置文件&#xff1a;application.properties # 服务端口 server.port8004# 服务名 spr…

电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。

统一供应商门户 便捷动态、呈现丰富 供应商门户具备内外协同的能力&#xff0c;为外部供应商集中推送展示与其相关的所有采购业务信息&#xff08;历史合作、考察整改&#xff0c;绩效评价等&#xff09;&#xff0c;支持供应商信息的自助维护&#xff0c;实时风险自动提示。…

互联网还会回暖吗?蛮三刀酱的2022年终技术总结

靠近年底的月份&#xff0c;内心深处总会不断提醒你&#xff0c;该写年终总结了。无论是工作上&#xff0c;生活上&#xff0c;亦或是互联网、APP上&#xff0c;无数的年终报告提醒我&#xff0c;一年了也该总结一下自己了&#xff0c;不然这之前的1年是不是白过了呢&#xff1…

Vue组件之间的通信(二)

一、兄弟组件之间的通信 &#xff08;1&#xff09;使用Vue的状态管理器Vue&#xff1a;建议在大型项目中使用 &#xff08;2&#xff09;使用第三方的模块&#xff1a;mitt(中央数据总线方式)&#xff0c;创建一个事件中心&#xff0c;由它来进行事件的监听、触发&#xff0…