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

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;

在这里插入图片描述

相关文章:

  • 贪吃蛇——c语言版
  • Joplin Typora 粘贴图片 | 当使用Typora作为Joplin编辑器时,如何粘贴图片并上传到Joplin服务器,替换链接
  • MySQL中动态权限和角色管理权限的异同?
  • AI 已经在污染互联网了。。赛博喂屎成为现实
  • 【SPIE独立出版 | 往届均已完成EI检索】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)
  • MySQL动态权限详解
  • RabbitMQ安装配置,封装工具类,发送消息及监听
  • 汽车IVI中控开发入门及进阶(三十一):视频知识扫盲
  • 2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)
  • AI音乐大模型:是颠覆还是助力?
  • 大众标准化杂志大众标准化杂志社大众标准化编辑部2024年第10期目录
  • 04. Java 多线程的创建
  • LogicFlow 学习笔记——9. LogicFlow 进阶 节点
  • 计算机组成原理必备知识点
  • PAT A1042. 洗牌机器
  • 数据库完整性基本概念及MySql语法
  • MYSQL数据库安装
  • SpringBoot整合SpringDataRedis
  • 使用Jetpack Compose和DummyJSON加速你的Android开发
  • Python Virtualenv:创建独立的 Python 开发环境
  • 本科生已发14篇SCI论文被指由其教授父亲挂名,重庆大学成立工作组核实
  • 上海推动AI+文旅深度融合,MaaS平台和产业基地落地徐汇
  • 国家主席习近平同普京总统签署关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明
  • 王日春已任教育部社会科学司司长,此前系人教社总编辑
  • 优化网络营商环境,上海严厉打击涉企网络谣言、黑灰产等违法犯罪
  • 公募基金行业迎系统性变革:基金公司业绩差必须少收费