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 的真正含义啦❀❀❀