在 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;
运行就会提示出错,为什么?
大家讲道理2017-04-17 12:05:11
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
就是一个例子
怪我咯2017-04-17 12:05:11
首先我们需要清楚命名空间的作用;命名空间是用来避免命名冲突的;
比如我自己定义了一个cout类,用来做输出使用;
//#mycout.h
class cout {
...
};
程序中有这么一段;
#include "mycout.h"
cout << "hello ";
编译没有问题,编译器找到我的cout类,链接使用;
如果我加上以下语句,包含了系统的cout类,并在全局范围内可见:
#include <iostream>
using namespace std;
这时候,编译器就犯迷糊了,现在有两个cout类,到底使用哪个无法确定,于是只有报错;
为了避免系统报错,我们可以自行决定使用哪个类;有以下几种解决方案:
这种方式会使用我自定的cout,同时可以用std空间中的其它类(使用时需加上std::前缀,比如std::string)
#include "mycout.h"
#include <iostream>
cout << "hello";
如果要使用系统cout,加上std::
#include "mycout.h"
#include <iostream>
std::cout << "hello";
//#mycout.h
namespace CC{
class cout {
...
};
}
#include "mycout.h"
#include <iostream>
using namespace std;
cout << "hello"; //使用系统的cout
CC::cout << "colin"; //使用我自定义的cout类