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

时间:2016-10-05 13:03:26

标签: c++ coding-style code-readability

我搜索了这个网站,人们说你应该避免使用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's tutorial中,它说:

  

请记住,使用from Package import specific_submodule没有错!实际上,这是推荐的表示法,除非   导入模块需要使用具有相同名称的子模块   不同的包裹。

我想知道我应该在c ++程序中做些什么。

2 个答案:

答案 0 :(得分:6)

从不头文件中使用using namespace std;或类似内容,因为它可能会导致因命名空间污染而导致的各种歧义问题。如果您遵守该规则,那么必须包含您的标题的人将会感谢您。出于类似的原因,我还会在标题中避免使用任何类型的using std::...。学会爱更详细的std::符号。

您在源文件中所做的事情很大程度上取决于您。这里的任何建议都基于意见,但就个人而言,我从不使用using只是为了节省输入,而是当它不可避免时,例如将阴影函数带回命名空间和模板中元编程。

答案 1 :(得分:3)

Imho这个问题是基于意见的。但是,这是我的意见:

不要使用:

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

等。我的论点相当简单,用

更好地证明了这一点
using std::sort;
using std::vector;

想象一下,你有一个包含bug的代码,现在你应该找到它。使用前面有std::的任何对象或函数都不太可能包含错误。因此,我总是喜欢看

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

而不是

vector<double> x;
sort(x);

因为后者要求我查找vectorsort实际上是什么(记住我们正在谈论C ++,即它可能是字面上的任何东西),只是为了发现它是{{1 }和std::vector。结论:我每次花费std::sort编写的时间为我节省了两倍或更多的时间进行调试。

为了减少基于意见的观点:你必须做出的明确权衡是可读性而不是打字。基于意见的是你更重视的......