重载<<并使用命名空间std

时间:2014-03-24 21:40:05

标签: c++

我需要帮助理解以下内容:

我重载<<运营商。我写了一个测试程序。我没有包含“using namespace std”代码。但该计划运作良好。

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

//using namespace std;

int main(void)
{
//constructing two fractions
    Fraction a(4, 2);
    Fraction b(17, 11);
//modifying them that is entering a fractions from keyboard
    cin>>a;
    cin>>b;
//computing product and quotient and printing them using cout
    cout<<a*b<<endl;
    cout<<a/b<<endl;
}

但是你可以看到我使用了来自标准命名空间的“endl”。你能解释一下我来到这里的“悖论”吗?

P.S我没有包含.h和.cpp文件,因为我认为它们无关紧要。

3 个答案:

答案 0 :(得分:1)

编译器适用于翻译单元。它需要一个.cpp然后在翻译单元中插入.h文本。如果您的头文件包含using namespace std;,它将有效地出现在编译器尝试编译的代码中。

这是一种不好的做法,因为如果其他命名空间使用相同的名称,您可以将命名空间using推到用户喉咙,并且可能导致名称冲突。

答案 1 :(得分:0)

如果您可以使用cincout,问题是使用endl,那么您的fraction.h文件最有可能以两种方式之一包含这些依赖项

using std::cin;
using std::cout;
using std::endl;

using namespace std;

答案 2 :(得分:0)

当你#include时,是否用文件直接替换文本。由于您#include "fraction.h"并且它可能有行

using namespace std;

主文件也使用std

另请注意,在头文件中using namespace std;不是一个好习惯,因为包含标头的其他任何地方也会自动使用std,如果程序员不知道,可能会导致冲突。