我搜索了这个网站,人们说你应该避免使用using namespace std
。我完全同意。但是,using std::cin
和using 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 ++程序中做些什么。
答案 0 :(得分:6)
从不在头文件中使用using namespace std;
或类似内容,因为它可能会导致因命名空间污染而导致的各种歧义问题。如果您遵守该规则,那么必须包含您的标题的人将会感谢您。出于类似的原因,我还会在标题中避免使用任何类型的using std::...
。学会爱更详细的std::
符号。
您在源文件中所做的事情很大程度上取决于您。这里的任何建议都基于意见,但就个人而言,我从不使用using
只是为了节省输入,而是当它不可避免时,例如将阴影函数带回命名空间和模板中元编程。
答案 1 :(得分:3)
不要使用:
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);
因为后者要求我查找vector
和sort
实际上是什么(记住我们正在谈论C ++,即它可能是字面上的任何东西),只是为了发现它是{{1 }和std::vector
。结论:我每次花费std::sort
编写的时间为我节省了两倍或更多的时间进行调试。
为了减少基于意见的观点:你必须做出的明确权衡是可读性而不是打字。基于意见的是你更重视的......