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

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

  

在这里插入图片描述

                                           博主主页:Yan. yan.

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;

在这里插入图片描述

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值