“ostream &os”的用途是什么?

4

我刚开始学C++,在《C++ Primer》上看到了一些函数,像这样:

double total_receipt(ostream &os)const{...}

然后我尝试使用这个代码查找cout的地址:"cout << &cout << endl;"

ostream &os和直接使用cout之间没有区别。

那么为什么不直接使用cout而是使用ostream &os?或者这只是一个“好”习惯?


9
这使得该函数能够用于向其他流(例如磁盘文件)写入数据。 - M.M
1
第一个是通过引用传递参数的语法。第二个是获取对象地址的语法。可悲的是它们是相同的 :-| - user207421
你可能会发现Istream function to read with istream parameter很有用。理解ostream& os将文件流的引用作为参数传递,这允许在函数内更新流状态(参见std::basic_ios<CharT,Traits>::rdstatestd::basic_ios<CharT,Traits>::setstate)。 - David C. Rankin
1个回答

5

注意:

当您声明一个方法时,需要使用参数的类名,因此如果您的类使用“输出流”(这就是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。这意味着,您的函数可以打印到文件,除了打印到终端外,因此如果需要,您可以添加更多功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接