suchen

Heim  >  Fragen und Antworten  >  Hauptteil

c++ - using namespace std 有什么用?什么时候用什么时候可以不用?

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

大家讲道理大家讲道理2807 Tage vor1189

Antworte allen(5)Ich werde antworten

  • 黄舟

    黄舟2017-04-17 12:05:11

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

    Antwort
    0
  • 黄舟

    黄舟2017-04-17 12:05:11

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

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-04-17 12:05:11

    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就是一个例子

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-04-17 12:05:11

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

    Antwort
    0
  • 怪我咯

    怪我咯2017-04-17 12:05:11

    首先我们需要清楚命名空间的作用;命名空间是用来避免命名冲突的;
    比如我自己定义了一个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类

    Antwort
    0
  • StornierenAntwort