应该避免或鼓励使用`using std::cin`和`using std::cout`吗?

3
我在这个网站上搜索,人们说应该避免使用using namespace std。我完全同意。但是,using std::cinusing std::string呢?这应该避免还是鼓励使用?
我知道总是输入std::cin是最安全的选择,但是一遍又一遍地输入它们非常繁琐。
然而,当你在文件开头输入using std::cin等时,看起来非常拥挤。例如,这个简单的程序读取并计算学生成绩,在它前面有太多using std::,看起来非常不舒服。
#include <iostream>
#include <ios>
#include <iomanip>
#include <stdexcept>
#include <vector>
using std::cin;             using std::cout;
using std::istream;         using std::vector;
using std::setprecision;    using std::domain_error;
using std::string;          using std::getline;
using std::streamsize;

istream& read_hw(istream& in, vector<double>& homework);
double grade(double mid_exam, double final_exam, \
        const vector<double>& homework);

int main()  {

    std::string name;
    std::getline(std::cin, name);
    std::cout << "Hello, " + name + "!" << std::endl;

    double mid_exam, final_exam;
    std::cin >> mid_exam >> final_exam;

    std::vector<double> homework;
    read_hw(std::cin, homework);

    try {
        double final_grade = grade(mid_exam, final_exam, homework);
        std::streamsize prec = std::cout.precision();
        std::cout << "your final grade is:" << std::setprecision(3)
            << final_grade << std::setprecision(prec) << std::endl;
    }
    catch(std::domain_error)    {
        std::cout << std::endl << "No homework entered!" << std::endl;
        return 1;
    }

    return 0;
}

std::istream& read_hw(std::istream& in, std::vector<double>& homework)   {
    if(in)  {
        homework.clear();
        double x;
        while(in >> x)  {
            homework.push_back(x);
        }
    }
    in.clear();

    return in;
}

double grade(double mid_exam, double final_exam, \
        const std::vector<double>& homework)    {
    std::vector<double>::size_type i, size;
    size = homework.size();
    if(size ==0)    {
        throw std::domain_error("no homework grade entered!");
    }
    double sum = 0;
    double average = 0;
    for(i = 0; i < size; ++i)   {
        sum += homework[i];
    }
    average = sum/size;

    return mid_exam*0.3 + final_exam*0.3 + average*0.4;
}

Python的教程中,它说:

记住,使用from Package import specific_submodule是没有问题的!实际上,除非导入模块需要使用来自不同包的相同名称的子模块,否则这是推荐的符号。

我想知道在C++程序中我应该怎么做。


3
个人建议您始终使用std::string等,除非将using语句的作用域限定在函数范围内。即使是这样,我也喜欢只使用std::来明确表示。 - NathanOliver
1
我注意到你使用了 using std::vector,但是在代码中又引用了 std::vector。两者不能同时存在。 - Martin Bonner supports Monica
1
此外,对于grade的参数而言,那个行继续符是不必要/不推荐的。 - Martin Bonner supports Monica
@MartinBonner 我没时间在程序中删除那些 std:: - an offer can't refuse
@buzhidao: 找到时间。我们都拥有同样的时间。 - Bathsheba
显示剩余9条评论
2个回答

6
头文件永远不要使用using namespace std;或类似的东西,因为这会导致由于名称空间污染而引起的各种歧义问题。如果你遵守这个规则,那么必须包含你的头文件的人会感谢你。出于类似的原因,我也会避免在头文件中使用任何形式的using std::...。学会喜欢更冗长的std::表示法。
在源文件中你可以做任何你想做的事情。这里的任何建议都基本上是基于个人意见的,但就我个人而言,从不仅仅为了节省打字而使用using,而是在不可避免的情况下使用它,例如将被隐藏的函数带回名称空间和在模板元编程中。

如果所有原帖作者得到的只是意见,那么你应该投票将其关闭为POB。 - NathanOliver
如果你正在编写一个简单的“Hello World”或教程类型的程序,只要没有其他库将cin或cout作为类型,使用namespace std会很有帮助。不需要用std::this std::that来复杂化教程。 - Dr Deo
1
@DrDeo:我非常不同意。我认为教科书似乎鄙视编写 std:: 的事实是造成这种情况的原因。它将这种风格植入了所有初学者程序员的思维中! - Bathsheba
@DrDeo 可以(或应该?)争辩说,在教程中没有任何好的理由(除了懒惰),不需要引入坏习惯。 - 463035818_is_not_a_number
std::是一个非常庞大的命名空间,包含许多常用名称,因此我仍建议在.cpp文件中避免使用它,即使对于初学者也可能会导致难以发现的错误,例如类型问题。 - Galik
显示剩余2条评论

3

我认为这个问题更多地基于个人观点。不过,以下是我的观点:

不要使用:

using std::cin;
using std::cout;
using std::string; 

或类似技术。我的观点很简单,最好通过示例来证明。

using std::sort;
using std::vector;

想象一下,你有一个包含错误的代码,现在你需要找到它。任何使用了以std::开头的对象或函数都极不可能包含错误。因此,我总是更喜欢看到一个

std::vector<double> x;
std::sort(x);

替代

vector<double> x;
sort(x);

因为后者需要我查找vectorsort实际上是什么(记住我们正在讨论C ++,它可能是任何东西),只是为了发现它是std :: vectorstd :: sort。结论:我每次写std :: 都节省了双倍或更多的调试时间。
稍微减少主观性:你必须做出明确的权衡,即可读性与输入量之间的权衡。主观性在于你更看重什么......

我认为关于“编码风格”这方面的问题都是基于个人观点的,然而有好的和不好的。此外,几乎所有的代码都是基于个人观点的,因为代码是到达答案的一种方式,但是有很多种方式。 - an offer can't refuse
正如我之前所说,我的观点是,某种方法的优劣并不因人而异,但你选择哪种方法则完全基于个人见解。 - 463035818_is_not_a_number

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接