C++命名空间

目录

命名空间是什么?

为什么要用命名空间

命名空间的使用方式

方式一

指定方式(作用域限定符)

方式二

方式三

引入(展开)命名空间域

如何使用好命名空间?

建议


命名空间是什么?

命名空间是一个声明性的区域,它是一种用于组织和管理代码的机制。它将代码放到不同的命名空间中,最主要的是可以避免命名冲突,尤其是在大型项目中。命名空间可以包含类、函数、变量等,使得它们在特定的命名空间内具有唯一的名称。通过使用命名空间,可以更好地组织和管理大型项目的代码,并提高代码的可读性和可维护性。

为什么要用命名空间

在大型的项目中,代码量是非常的大,那么就有可能一个部门可能会有很多人用相同名字命名的函数、变量、类,如果它们的命名相同,那么就会导致编译器无法确定应该调用哪个函数或者使用哪个变量,从而导致多次声明而引发错误。命名空间最主要就是为了解决这个问题而引入的

命名冲突的例子:

#include<iostream>
#include<string.h>

int strlen = 857;

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

这个代码运行

这个代码运行后呢,就导致了strlen重定义,也就是strlen这个变量命名与<string.h>标准库中的strlen函数名冲突了。补充一个小知识:.h文件在预处理时,如果.c或者cpp文件用了.h文件,那么这个文件会直接展开,并且生成一个.i文件,把.h的文件与.c或.cpp的文件相结合

那么如果我们非要用这个变量名字命名可不可以呢?答案是可以的,这就需要用到上面所说的命名空间了,命名空间的关键字是namespace,定义方式是 namespace + 命名空间名 { 代码块 }

namespace hhh
{
	int strlen = 857;
}

现在命名空间定义好了,我们要如何去使用这个命名空间里面所定义的变量呢?这个时候就要使用一个作用域限定符 :: 其实看起来就是两个冒号,作用域限定符的使用方法是:命名空间名::定义的变量(函数、类)

注意: 编译器默认不会访问命名空间里的内容,只有指定后才会访问

命名空间的使用方式

方式一

指定方式(作用域限定符)

#include<iostream>
#include<string.h>

namespace hhh
{
	int strlen = 857;
}

int main()
{             //指定在hhh命名空间找
	printf("%d\n", hhh::strlen);
	return 0;
}

指定的命名空间 :: 变量      就是指定在某某命名空间找

此时程序就能正常把strlen这个变量打印出来了

方式二

使用using关键字将命名空间中某个成员引入,使用方法:using 命名空间 :: 命名空间的某个成员,很多人习惯叫做 把某个成员展开到全局

这么做的意义是什么呢?这样做的好处是:在用命名空间里某个成员时,就可以不用作用域限定符::也能访问命名空间的这个成员了,使我们在用命名空间里的某个常用成员的时候更加方便的使用了

#include<iostream>

namespace hhh
{
	int test = 0;
}

using hhh::test;

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

注意:这样虽然很方便,但是不能与标准库或者别的命名空间的变量(类、函数)命名冲突,因为如果将这个命名空间的某个成员引入(展开)的话,就相当于暴露在全局环境下了(相当于全局变量)就容易与别的命名冲突

#include<iostream>

namespace hhh
{
	int strlen = 0;
	int aa = 0;
}

namespace xxh
{
	int aa = 0;
}

//展开后与标准库中的<string.h>的函数名strlen  命名冲突
using hhh::strlen;

using hhh::aa;

//展开后与hhh命名空间里的aa命名冲突
using xxh::aa;

接下来我要说的就是方式三了,但是在这之前,先看一段代码

#include<iostream>
using namespace std;

int main()
{
	cout << "hello C++" << endl;
	return 0;
}

看了这个代码后,你可能首先想到的是“这不就是一个简单的打印 hello C++吗”,如果你认为作者要表达的是这个意思,那你就肤浅了。

在我们学习C++看到的第一个程序的时候,可能你是在书上看到、可能你是在网上看到,都是这样简单的打印一个字符串。那你知道 using namespace std; 这段代码是什么意思嘛?首先std是C++官方库定义的命名空间,C++官方库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准函数库中的函数或对象都要使用std来限定。所以这段代码的意思就是 把 std这个命名空间 引入(展开)也就是暴露在了全局  ,意思跟方式二的一样,只不过这里是把整个命名空间都引入(展开)了

方式三

引入(展开)命名空间域

使用方法:using namespace 命名空间名称 ,在使用using namespace命名空间之后,可以直接使用该命名空间中的所有成员,而不必在代码中使用命名空间前缀 和作用域界定符。此时编译器会默认从这个命名空间里寻找对应的变量、函数、类(默认在全局找的同时也默认在这个命名空间里找)

#include<iostream>

namespace hhh
{
	int b = 0;
	int a = 1;

	int add(int a, int b)
	{
		return a + b;
	}
	int c = 3;
}

//把hhh命名空间引入(展开)
using namespace hhh;

//把std命名空间引入(展开)
using namespace std;

int main()
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	cout << add(a,b) << endl;
	return 0;
}

此时是不是觉得方式三用起来更加的舒服更加的爽了,可能你会疑问为什么方式三这么方便且好用,为什么还要方式一和方式二呢?看一段代码,毕竟代码说明一切

#include<iostream>
namespace hhh
{
	int rand = 1;
}

using namespace hhh;
using namespace std;
int main()
{
	cout << rand << endl;
	return 0;
}

此时编译都不通过,原因是这个变量rand与<stdlib.h>库中的rand()函数命名冲突了,而编译器无法确定也无法区分要使用哪个同名的标识符,从而导致编译错误,所以,全部展开是有风险的,尤其是 官方库std 命名空间。

如何使用好命名空间?

建议

1. 在日常练习中,建议直接using namespace std即可,这样就很方便。

2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对 象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模 大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值