在 C++ 中 using namespace std;
有什么用,什么时候用什么时候可以不用,
#include<iostream.h>
using namespace std;
class point
{
public:
int x;
int y;
void print()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
};
void main()
{
point pt;
pt.x=0;
pt.y=1;
pt.print();
}
这段代码如果不注释掉 using namespace std;
运行就会提示出错,为什么?
“里面有……………………”有啥,后面的我的上面就不显示了
理论上都可以不用。但前提是你要把名称写全,比如std::cout。
namespace
简单来讲是这样的,(拿一个杜撰的例子)从前有个人,写了一个文件操作模块,里面有个
open(char*)
来打开一个普通文件;后来又写了个数据库操作模块,里面也有一个
open(char*)
用来打开一个数据库文件;有一天他发现自己的一个程序同时用到了这两个模块,结果因为函数重名导致编译失败了~
解决方案很简单,改名呗~
可是如果把两个模块中这么多的
open()
分别改成file_open
和database_open
,实在是太麻烦,于是namespace
的作用就体现出来了,他只要将两个模块简单修改为namespace file{文件操作模块的原始内容};
和namespace database{数据库操作模块的原始内容};
就行了~(仅仅添加了几行代码而已哈)这样他需要打开文件时写
file::open
,在需要打开数据库时写database::open
,就没有重名问题了可是这样子的话就不存在
open
函数了,所有涉及文件操作的函数都要加上file::
前缀,数据库操作都需要database::
前缀,他突然发现以前写的代码都不能编译了~难道以前的代码要大改吗?不必,以文件操作为例,只要加上一句
using namespace file;
就会在全局应用file
命名空间,编译器就会尝试查找file::open
函数,所以以前的代码只要多加一句代码就能编译了~回到重点,因为C 的库中用到了
sort
、swap
等常见的函数名,很容易与用户自定义的函数同名,为了避免名字冲突,默认把所有的库函数都放到了std
命名空间中,这样的话如果我们也写了一个函数叫sort
就不会造成命名冲突,因为库中的那玩意全名是std::sort
但是我们平时写程序都挺谨慎的,命名也足够规范,很少出现名称重复,反倒是
std::
的前缀太多余,连写个输出都要用std::cout
,所以方便起见,就来一句using namespace std;
来省略所有的前缀。但是这样相当于屏蔽了namespace
所提供的功能,这时候如果你作死写了一个swap
函数结果命名冲突了,可别怪C 没有提供解决方案;当然之前的叙述有不当之处,并非只有函数才能放到
namespace
里,变量、类、结构体等等都是可以的,cout
就是一个例子意思是使用标准的命名空间,如果不用的话需要使用比如std::cout来指明命名空间
首先我们需要清楚命名空间的作用;命名空间是用来避免命名冲突的;
比如我自己定义了一个cout类,用来做输出使用;
程序中有这么一段;
编译没有问题,编译器找到我的cout类,链接使用;
如果我加上以下语句,包含了系统的cout类,并在全局范围内可见:
这时候,编译器就犯迷糊了,现在有两个cout类,到底使用哪个无法确定,于是只有报错;
为了避免系统报错,我们可以自行决定使用哪个类;有以下几种解决方案:
去掉using namespace std
这种方式会使用我自定的cout,同时可以用std空间中的其它类(使用时需加上std::前缀,比如std::string)
加上using标识
如果要使用系统cout,加上std::
对我自行定义的cout加上命名空间(推荐做法)