C++基础知识——命名空间

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

在这里插入图片描述

                                           博主主页:Yan. yan.

文章目录

  • 1、什么是命名空间
  • 2、命名空间的作用
  • 3、如何定义命名空间
  • 3、使用命名空间的三种方式
    • 加命名空间名称及作用域限定符
    • 使用using将命名空间中某个成员引入
    • 使用using namespzce命名空间名称引入

1、什么是命名空间

  命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开,使其与其他代码的名称不冲突;
  命名空间的原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,同时若是在同一个作用域内可能出现的命名冲突也不会造成影响,有效避免了命名空间的污染;

2、命名空间的作用

  在学习C语言的过程中我们知道有一个函数叫做rand函数,该函数用于生成伪随机整数;

#include<stdio.h>

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

在这里插入图片描述


  但若是在包含rand函数所在的头文件为前提的结果是什么?

#include<stdio.h>
#include<stdlib.h>

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

在这里插入图片描述
  此时编译器报错。
  原因是,在程序运行时,计算机先会在局部寻找变量,当局部内未找到时则回去全局找;
在全局找时找到了两个 rand (一个为头文件内的rand函数,一个为所创建的变量rand);
此时也不知该打印哪一个rand,这就叫命名冲突


  但在C++中,出现了一个新的概念叫做命名空间,一般来说,rand这类的函数都存放于C++中标准库类型对象的命名空间std中;
#include<iostream>//标准输入输出流头文件
using namespace std;//展开标准库命名空间std

namespace Sweet{//设置命名空间且名为Sweet
	int rand = 10;
}

int main()
{
	cout << rand << endl;//打印rand
	cout << Sweet::rand << endl;//打印Sweet中的rand(::符号为作用域限定符)

	return 0;
}

在这里插入图片描述


  这里的cout是指打印输出; cin 是输入;endl是换行

3、如何定义命名空间

  从上面可知命名空间的作用,既然命名空间能够有效防止命名冲突,那该如何定义命名空间?
  在定义命名空间时,应该使用 namespace 修饰且在该修饰词后定义名字并在其后跟 **{ }**在{ }内的元素即为该命名空间的成员;

#include<iostream>

using namespace std;//展开std命名空间

namespace A1 {//定义一个名为A1的命名空间
	int a = 0;
	int b = 20;//变量

	void Add()//函数
	{
		cout << "IsAddFunc1" << endl;
	}

	struct TestNode//结构体
	{
		int test1;
		double test2;
	};
}

namespace A2 {//定义一个名为A2的命名空间
	int a = 10;
	int b = 21;

	void Add()
	{
		cout << "IsAddFunc2" << endl;
	}

	struct TestNode
	{
		int test3;
		double test4;
	};
}
int main()
{
	cout << "A1::b = " << A1::b << endl;//打印A1中的b
	cout << "A2::b = " << A2::b << endl;//打印A2中的b

	A1::Add();//调用A1中的Add函数
	A2::Add();//调用A2中的Add函数

	struct A1::TestNode AT1;//声明结构体变量
	struct A2::TestNode AT2;

	cout << &AT1 << endl;//打印结构体变量地址
	cout << &AT2 << endl;

	return 0;
}

在这里插入图片描述

  从该段代码可知命名空间内不仅可以声明(定义)变量,还可以包含函数、类、typedef以及#define宏等等;

3、使用命名空间的三种方式

加命名空间名称及作用域限定符

yan::a

yan::Add(1, 2)

在这里插入图片描述

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

  这种方式也叫做命名空间部分展开

using yan::a

using yan::Add

在这里插入图片描述

使用using namespzce命名空间名称引入

  这种方式也叫做命名空间全部展开

using namespace std;

using namespace yan;

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FastAPI 作为H5中流式输出的后端

FastAPI 作为H5中流式输出的后端 最近大家都在玩LLM&#xff0c;我也凑了热闹&#xff0c;简单实现了一个本地LLM应用&#xff0c;分享给大家&#xff0c;百分百可以用哦&#xff5e;^ - ^ 先介绍下我使用的三种工具&#xff1a; Ollama&#xff1a;一个免费的开源框架&…

微观时空结构和虚数单位的关系

回顾虚数单位的定义&#xff0c; 其中我们把称为周期&#xff08;的绝大部分&#xff09;&#xff0c;称为微分&#xff0c;0称为原点或者起点&#xff08;意味着新周期的开始&#xff09;&#xff0c;由此我们用序数的概念反过来构建了基数的概念。 周期和单位显然具有倍数关…

日本立法强制苹果开放第三方应用商店

近日&#xff0c;苹果生态系统最坚固的垄断围墙在亚洲首次被突破&#xff0c;日本议会通过了名为《促进特定智能手机软件竞争法》的新法案&#xff0c;要求苹果和谷歌公司允许第三方应用商店并允许第三方开发者使用iPhone的NFC芯片进行支付&#xff0c;如果不遵守规定&#xff…

python学习笔记-09

面向对象编程-中 面向对象三大特征&#xff1a;封装、继承、多态。 封装&#xff1a;把内容封装起来便于后面的使用。对于封装来讲&#xff0c;就是使用__init__方法将内容封装道对象中&#xff0c;然后通过对象直接或者self获取被封装的内容。 继承&#xff1a;子继承父的属…

node + selenium-webdriver 进行Web自动化测试

1、环境安装 nodejs安装 webdriver安装,安装各浏览器的驱动,通过各浏览器的驱动程序,操作浏览器。 chrome 驱动安装 每个版本的浏览器用到的webdriver不同。可以通过chrome右上角-> 帮助 -> 关于 Chrome 查看当前版本。 chromedriver下载地址和chromedriver与chrome之…

单木:面试官超爱问的字符串,今天给它彻底讲透

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。今天这边文章&#xff0c;想和大家聊聊有关字符串的问题&#xff0c;字符串似乎很简单&#xff0c;但其实字符串几乎…

【多模态论文】CLIP(Contrastive Language-Image Pre-training)

论文&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 链接&#xff1a;https://arxiv.org/abs/2103.00020 摘要 问题&#xff1a; 对预定的类别进行预测&#xff0c;这种有监督的训练形式受限于额外标记数据 。如何利用图像的原始文本来获…

为什么3D渲染让客户无法抗拒?7个重要原因

客户通常对工程、建筑、复杂的室内外设计知之甚少&#xff0c;展示草图只会让他们感到难以理解。不过&#xff0c;现代设计师和建筑师不再需要为此烦恼。 通过使用逼真且沉浸式的3D渲染&#xff0c;他们可以让能够轻松地向客户传达信息和沟通想法。它对赢得客户至关重要。接下…

Java多线程设计模式之保护性暂挂模式

模式简介 多线程编程中&#xff0c;为了提高并发性&#xff0c;往往将一个任务分解为不同的部分。将其交由不同的线程来执行。这些线程间相互协作时&#xff0c;仍然可能会出现一个线程等待另一个线程完成一定的操作&#xff0c;其自身才能继续运行的情形。 保护性暂挂模式&a…

NodeJs 连接本地 mySql 数据库获取数据

写在前面 今天把 nodejs 连接本地数据库的坑简单的踩一下&#xff0c;为后续写接口做个铺垫 安装 mySql &#xff08;mac举例子&#xff09; 安装地址 安装完成大概这个样子&#xff0c;起动起来就行 安装本地数据库连接工具&#xff08;navicat举例子&#xff09; 安装地…

文件防篡改监控工具 - WGCLOUD全面介绍

WGCLOUD是一款优秀的运维监控软件&#xff0c;免费、轻量、高效&#xff0c;部署容易&#xff0c;上手简单&#xff0c;对新手非常友好 WGCLOUD部署完成后&#xff0c;点击菜单【文件防篡改】&#xff0c;可以看到如下页面 我们点击【添加】按钮&#xff0c;输入监控文件的信息…

赛力斯:“新王”能做多久

最近&#xff0c;电车圈又有大事了。 造车新势力们迎来“新王”——赛力斯。 最近&#xff0c;赛力斯市值突破1500亿&#xff0c;反超理想&#xff0c; 成为新势力市值一哥。 今年第一季度&#xff0c;赛力斯新能源汽车销量达94825辆&#xff0c;同比增长高达374.77%&#xf…

想要高效回复客户消息?来看看这个款微信神器

不管是销售还是客服来说&#xff0c;能及时回复客户的反馈和问题&#xff0c;是确保顾客满意度的关键因素。 今天&#xff0c;就给大家分享一个职场必备神器——个微管理系统&#xff0c;帮助大家提高回复效率&#xff01; 首先&#xff0c;你可以在系统上设置自动通过好友后自…

聊聊其他之ShowDoc安装部署

聊聊其他之ShowDoc安装部署 Docker离线安装部署 由于很多公司服务器处于内网环境&#xff0c;跟外网阻断&#xff0c;所以需要通过离线的方式进行Docker镜像安装。 Linux环境准备 第一步&#xff1a;检查防火墙&#xff0c;是否关闭。 查看防火墙状态&#xff1a; [rootlo…

java后端方法地址组成解析

本篇文章旨在记录后端方法被调用时&#xff0c;是如何组成的&#xff0c;以及组成的部分。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、后端方法地址是什么&#xff1f; 示例&#xff1a;http://127.0.0.1:8080/user/info 如果携带了路径参数…

主存储器的基本组成+容量扩展+与CPU的连接

1.基本组成 1.主存储器的基本组成和读写操作 主存储器被称为主存/内存。是计算机中存储程序的重要部件 主存储器内部包含了存储体、各种逻辑部件以及控制电路等。 主存是通过寻址的方式对存储体内的存储单元进行读写操作的。 主存首先要从MAR获取地址&#xff0c;之后译码器…

Java23种设计模式(五)

1、MVC 模式 MVC 模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。这种模式用于应用程序的分层开发。 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑&#xff0c;在数据变化时更新控制器。…

惠海H4120 降压IC 40V 36V 30V降压5V3A 9V3A 12V3A 动态响应优异,低纹波

H4120是一款功能优良的异步降压型DC-DC转换器。它的主要特性和优势如下&#xff1a; 产品特性&#xff1a; 内置40V耐压MOS&#xff1a;内置的高耐压MOS使得H4120能够处理更多种的输入电压范围&#xff0c;增强了其适用性和可靠性。 宽输入范围&#xff1a;输入电压可在5V至…

ubuntu18.04 安装HBA

HBA是一个激光点云层级式的全局优化的程序&#xff0c;他的论文题目是&#xff1a;HBA: A Globally Consistent and Efficient Large-Scale LiDAR Mapping Module&#xff0c;对应的github地址是&#xff1a;HKU-Mars-Lab GitHub 学习本博客&#xff0c;可以学到gtsam安装&am…

android串口助手apk下载 源码 演示 支持android 4-14及以上

android串口助手apk下载 1、自动获取串口列表 2、打开串口就开始接收 3、收发 字符或16进制 4、默认发送at\r\n 5、android串口助手apk 支持android 4-14 &#xff08;Google seral port 太老&#xff09; 源码找我 需要 用adb root 再setenforce 0进入SELinux 模式 才有权限…