我刚开始学C++,在《C++ Primer》上看到了一些函数,像这样:
double total_receipt(ostream &os)const{...}
然后我尝试使用这个代码查找cout
的地址:"cout << &cout << endl;"
ostream &os
和直接使用cout
之间没有区别。
那么为什么不直接使用cout
而是使用ostream &os
?或者这只是一个“好”习惯?
我刚开始学C++,在《C++ Primer》上看到了一些函数,像这样:
double total_receipt(ostream &os)const{...}
然后我尝试使用这个代码查找cout
的地址:"cout << &cout << endl;"
ostream &os
和直接使用cout
之间没有区别。
那么为什么不直接使用cout
而是使用ostream &os
?或者这只是一个“好”习惯?
注意:
当您声明一个方法时,需要使用参数的类名,因此如果您的类使用“输出流”(这就是ostream
的含义),则声明函数的方式如下:
double total_receipt(ostream &os)
你不能这样创建函数:
double total_receipt(cout) // doesn't work
total_receipt
函数的区别:double total_receipt(ostream &os) {
os << "hello world" << std::endl;
}
double total_receipt() {
std::cout << "hello world" << std::endl;
}
这取决于你。通常,我们使用第一个,因为它可以用于除了cout
之外的其他操作,例如:
ofstream out_file("my_file.txt");
total_receipt(out_file);
因此,您可以将任何继承自 ostream
的类的对象传递给该函数,例如在示例中的 ofstream
。这意味着,您的函数可以打印到文件,除了打印到终端外,因此如果需要,您可以添加更多功能。
ostream& os
将文件流的引用作为参数传递,这允许在函数内更新流状态(参见std::basic_ios<CharT,Traits>::rdstate和std::basic_ios<CharT,Traits>::setstate)。 - David C. Rankin