应该避免还是鼓励“使用std::cin”和“使用std::cout”?

Should `using std::cin` and `using std::cout` be avoided or encouraged?

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

Remember, there is nothing wrong with using from Package import specific_submodule! In fact, this is the recommended notation unless the importing module needs to use submodules with the same name from different packages.

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

永远不要header文件中使用using namespace std;或类似的东西,因为它会导致各种歧义由于命名空间 污染 而出现的问题。如果您遵守该规则,那么必须包含您的 header 的人会为此感谢您。出于类似的原因,我也会避免在 header 中使用任何形式的 using std::...。学会喜欢更冗长的 std:: 符号。

您在源文件中所做的在很大程度上取决于您自己。这里的任何建议主要是 opinion-based,但就我个人而言,我 从不 使用 using 只是为了节省打字时间,而是在不可避免的情况下使用,例如将阴影函数带回命名空间,并在模板元编程中。

恕我直言,这个问题是基于意见的。但是,这是我的看法:

不要使用:

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:: 节省了我两倍或更多的调试时间。

让它不那么基于意见:你必须做出的明确权衡是可读性和更少的输入。基于意见的是您更看重的....