【问题标题】:Should `using std::cin` and `using std::cout` be avoided or encouraged?是否应该避免或鼓励使用 std::cin 和使用 std::cout?
【发布时间】:2025-12-02 03:20:03
【问题描述】:

我搜索了这个网站,有人说你应该避免使用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++ 程序中做什么。

【问题讨论】:

  • 就个人而言,我建议您始终使用 std::string 等,除非您将 using 语句的范围限定为函数范围。即使这样,我也喜欢只使用 std:: 来明确。
  • 我注意到你有一个using std::vector,但是你在代码中引用了std::vector。两者兼有是不对的。
  • 另外,grade 的参数的那一行延续是不需要/不希望的
  • 最后,如果写输出抛出,你不会恢复精度。
  • @MartinBonner 我没有时间删除程序中的那些std::...

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


【解决方案1】:

切勿头文件中使用using namespace std;或类似名称,因为它可能会导致由于命名空间污染而出现的各种歧义问题.如果您遵守该规则,那么必须包含您的标题的人会感谢您。出于类似的原因,我也会避免在标题中使用任何类型的using std::...。学会爱上更冗长的std:: 表示法。

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

【讨论】:

  • 如果所有 OP 将获得意见,您应该投票关闭作为 POB。
  • 我相信第一段不是基于意见的。
  • 如果您正在编写一个简单的 hello world 或教程类型的程序,只要没有其他库将 cin 或 cout 作为类型,它有助于 使用命名空间 std。无需使用 std::this 使教程复杂化 std::that ....
  • 谢谢你的建议,我觉得我应该从一开始就养成一个好习惯。
  • @DrDeo:我完全不同意。我认为教科书似乎鄙视写作std:: 的事实是造成这种情况的原因。它将这种风格融入我们所有初学者程序员的脑海中!
【解决方案2】:

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

不要使用:

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

为了减少基于意见:您必须做出的明确权衡是可读性与更少的打字。基于意见是你更看重的......

【讨论】:

  • 我认为coding-style 的问题都是基于意见的,但是有好的和坏的。此外,几乎所有的代码都是基于意见的,因为代码是答案的方法,但是方法有很多。
  • @buzhidao 正如我所说,恕我直言不基于意见的是一种方法与另一种方法的优缺点。您选择哪一个纯粹是基于意见