C++中的 using namespace std 到底是什么?

1.来历?

在一个C语言项目中,我们往往会定义很多个变量,并且如果是一个多人协作的大型项目,那每个人定义的变量是非常有可能发生命名冲突的,C++之父 本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)在使用C语言写代码的时候也发现了这个问题,因此他在创作C++的时候对C语言进行了改进,其中就包括命名空间 namespace .

2.命名空间namespace有什么作用?

当我们定义了一个自己的函数,在调用的时候,为了避免和C++头文件中的函数发生命名冲突,这时候就需要有一片属于我们自己的空间,在需要这个函数的时候就让编译器去我们自己的空间里找那个函数,而不是直接在全局里找,因此,命名空间的作用主要是避免命名冲突的问题.

3.namespace 定义的空间怎么使用?

1. 命名空间中包含普通变量

当我们用C语言写代码的时候,其中有一个头文#include<stdlib.h>中包含了函数 rand ,那我们想要自己定义一个变量或函数 rand 就需要定义一个自己的命名空间,这里我以 crs 为我的定义的命名空间,如下:

namespace crs
{
	int rand = 10;
}

其中 namespace 定义命名空间的标准语法, crs 是我定义的命名空间 ,定义完成之后需要加上 { } 来限定命名空间中的内容, 空间内的 rand 就是我自己的rand变量,并不是函数.

好了,我自己的命名空间和变量已经定义完成了,那怎么使用我自己命名空间里的rand变量呢?这里就需要用到C++中的作用域符号 :: ,在命名空间后加上::再加上命名空间内的变量即可
举个例子,调用rand变量:

int main()
{
	//调用命名空间crs中的变量rand
	cout << crs::rand << endl;

	return 0;
}

运行结果为:
在这里插入图片描述
但是当我包含了头文件#inlcude<stdlib.h>后,在不使用作用域符调用命名空间中的变量时,编译器会默认调用头文件中的rand函数:

int main()
{
	//调用命名空间crs中的变量rand
	cout << crs::rand << endl;

	//使用头文件中的函数rand
	cout << rand << endl;

	return 0;
}

运行结果:
在这里插入图片描述
因为头文件的rand是一个函数,因此直接用函数名打印出来的是rand函数的地址.

2. 命名空间中定义函数

命名空间中不仅能定义变量,还能定义函数例如

#include<iostream>


using std::cout;
using std::endl;


namespace crs
{
   int rand = 10;
   int Add(int a, int b)
   {
   	return a + b;
   }
}

int Add(int a, int b)
{
   return (a + b) * 10;
}

int main()
{

   //调用命名空间中的Add函数
   cout << "调用命名空间中的Add函数:" << crs::Add(1, 2) << endl;

   //调用全局变量中的Add函数
   cout << "调用全局变量中的Add函数:" << Add(1, 2) << endl;

   return 0;
}

运行结果为:
在这里插入图片描述

3.命名空间中定义结构体变量

命名空间中也是可以定义结构体的,例如:

#include<iostream>


using std::cout;
using std::endl;


namespace crs
{
	int rand = 10;
	int Add(int a, int b)
	{
		return a + b;
	}

	struct crss
	{
		int a = 10;
	};
}

int Add(int a, int b)
{
	return (a + b) * 10;
}

int main()
{
	//调用命名空间中的结构体
	struct crs::crss tmp;
	cout << tmp.a << endl;

	return 0;
}

运行结果为:
在这里插入图片描述

4. 命名空间中定义命名空间

命名空间是可以"套娃的",举个栗子:

#include<iostream>


using std::cout;
using std::endl;


namespace crs
{
	int rand = 10;
	int Add(int a, int b)
	{
		return a + b;
	}

	struct crss
	{
		int a = 10;
	};

	namespace crs1
	{
		int Add(int a, int b)
		{
			return a + 2*b;
		}
	}
}

int Add(int a, int b)
{
	return (a + b) * 10;
}

int main()
{
	//调用命名空间crs中的命名空间crs1中的Add函数
	cout << "调用命名空间crs中的命名空间crs1中的Add函数:" << crs::crs1::Add(1, 2) << endl;

	return 0;
}

运行结果如下:
在这里插入图片描述

4.using namesapce std 的真正含义

根据以上三点的讲述,我们知道了using namespace std 是使用 std 这个命名空间,而std是C++的一个标准空间,它被包含在C++头文件#include中,当我们在使用标准空间里的函数例如 cout , cin ,endl 等等的时候原本是需要在cout前面加上 std:: 的,但是在使用了using namesapce std 后,就表示在整个项目中,都可以直接调用std空间中的函数而不用加上作用域符号 :: ,这样在使用std中的函数的时候会比较方便,当然,在完全展开std空间后也要注意变量和函数命名的冲突问题

以上就是 using nameslpace std 的真正含义啦❀❀❀

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值