c++ - using namespace std 有什么用?什么时候用什么时候可以不用?
大家讲道理
大家讲道理 2017-04-17 12:03:11
0
5
1157

在 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; 运行就会提示出错,为什么?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全員に返信(5)
黄舟

“里面有……………………”有啥,后面的我的上面就不显示了

いいねを押す +0
黄舟

理论上都可以不用。但前提是你要把名称写全,比如std::cout。

いいねを押す +0
大家讲道理

namespace简单来讲是这样的,(拿一个杜撰的例子)
从前有个人,写了一个文件操作模块,里面有个 open(char*) 来打开一个普通文件;
后来又写了个数据库操作模块,里面也有一个 open(char*) 用来打开一个数据库文件;
有一天他发现自己的一个程序同时用到了这两个模块,结果因为函数重名导致编译失败了~
解决方案很简单,改名呗~
可是如果把两个模块中这么多的open()分别改成file_opendatabase_open,实在是太麻烦,于是namespace的作用就体现出来了,他只要将两个模块简单修改为namespace file{文件操作模块的原始内容};namespace database{数据库操作模块的原始内容};就行了~(仅仅添加了几行代码而已哈)
这样他需要打开文件时写file::open,在需要打开数据库时写database::open,就没有重名问题了
可是这样子的话就不存在open函数了,所有涉及文件操作的函数都要加上file::前缀,数据库操作都需要database::前缀,他突然发现以前写的代码都不能编译了~
难道以前的代码要大改吗?不必,以文件操作为例,只要加上一句using namespace file;就会在全局应用file命名空间,编译器就会尝试查找file::open函数,所以以前的代码只要多加一句代码就能编译了~

回到重点,因为C++的库中用到了sortswap等常见的函数名,很容易与用户自定义的函数同名,为了避免名字冲突,默认把所有的库函数都放到了std命名空间中,这样的话如果我们也写了一个函数叫sort就不会造成命名冲突,因为库中的那玩意全名是std::sort

但是我们平时写程序都挺谨慎的,命名也足够规范,很少出现名称重复,反倒是std::的前缀太多余,连写个输出都要用std::cout,所以方便起见,就来一句using namespace std;来省略所有的前缀。但是这样相当于屏蔽了namespace所提供的功能,这时候如果你作死写了一个swap函数结果命名冲突了,可别怪C++没有提供解决方案;

当然之前的叙述有不当之处,并非只有函数才能放到namespace里,变量、类、结构体等等都是可以的,cout就是一个例子

いいねを押す +0
巴扎黑

意思是使用标准的命名空间,如果不用的话需要使用比如std::cout来指明命名空间

いいねを押す +0
刘奇

首先我们需要清楚命名空间的作用;命名空间是用来避免命名冲突的;
比如我自己定义了一个cout类,用来做输出使用;

//#mycout.h
class cout {
...
};

程序中有这么一段;


#include "mycout.h"
cout << "hello ";

编译没有问题,编译器找到我的cout类,链接使用;

如果我加上以下语句,包含了系统的cout类,并在全局范围内可见:

#include <iostream>
using namespace std;

这时候,编译器就犯迷糊了,现在有两个cout类,到底使用哪个无法确定,于是只有报错;
为了避免系统报错,我们可以自行决定使用哪个类;有以下几种解决方案:

去掉using namespace std

这种方式会使用我自定的cout,同时可以用std空间中的其它类(使用时需加上std::前缀,比如std::string)

#include "mycout.h"
#include <iostream>

cout << "hello";

加上using标识

如果要使用系统cout,加上std::

#include "mycout.h"
#include <iostream>

std::cout << "hello";

对我自行定义的cout加上命名空间(推荐做法)


//#mycout.h
namespace CC{
    class cout {
    ...
    };
}
#include "mycout.h"
#include <iostream>
using namespace std;

cout << "hello"; //使用系统的cout
CC::cout << "colin"; //使用我自定义的cout类
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート