gpt4 book ai didi

c++ - 函数返回 iostream 而其参数之一也是 iostream 是强制性的还是只是约定

转载 作者:行者123 更新时间:2023-11-28 04:10:09 28 4
gpt4 key购买 nike

最近我在阅读 Accelerated C++ 并从练习答案中发现了这个有趣的代码。这是完整的代码,

#include "stdafx.h"
#include "4_4.h"

#include <vector>
using std::vector;

#include <iostream>
using std::ostream;
using std::streamsize;
using std::cout;
using std::endl;

#include <exception>
using std::domain_error;

#include <iomanip>
using std::setw;

vector<double> square_double(const unsigned int range)
{
vector<double> squares;
if (range > squares.max_size())
throw domain_error("Range argument exceeds vector limit.");

for (unsigned int i = 0; i < range; i++)
squares.push_back(i * i);

return squares;
}

double GetNumberOfDigits(const double i)
{
return i > 0 ? log10(i) + 1 : 1;
}

ostream& print_squares(ostream& os, const vector<double>& v)
{
if (os)
{
streamsize digits_i = (streamsize) GetNumberOfDigits(v.size());
streamsize digits_v = (streamsize) GetNumberOfDigits(v.back());

for (vector<double>::size_type i = 0; i < v.size(); i++)
{
streamsize s_size = os.width();
os << setw(digits_i) << i << " " << setw(digits_v) << v[i] << endl;
os.width(s_size);
}
}

return os;
}

int ex4_4()
{
vector<double> v = square_double(500);
print_squares(cout, v);

return 0;
}

此函数的目的是计算具有固定步长的范围之间的值的平方。令我困惑的是答案只使用了print_square函数一次,这个函数中的for循环已经完成了打印的所有工作,那么为什么他使用 ostream&?此代码块中没有 chained-ostream 输出,对吗?

代码本身很容易理解,但是这个函数的返回ostream&让我很困惑。为什么我应该使用 ostream& 而不仅仅是 void ?无论如何,cout 只是使用它的“副作用”来打印东西,那么为什么要返回它自己呢?这是某种约定吗,因为在这个代码块之后我没有看到使用 cout 的进一步输出。

感谢!

最佳答案

需要返回其输入的唯一一种函数 ostream是一个 operator<<执行。不要求甚至鼓励使用其他类型的功能。

可能 print_squares() 是有意义的返回它的 ostream如果它被用作相关 operator<< 的一部分实现,例如:

ostream& operator<<(ostream &os, const vector<double>& v)
{
return print_squares(os, v);
}

但是,即使没有返回值,print_squares()仍然可以使用:

ostream& operator<<(ostream &os, const vector<double>& v)
{
print_squares(os, v);
return os;
}

但无论哪种方式,在您引用的具体示例中都不是这种情况。 print_squares() 的返回值被调用者完全忽略,所以声明的返回值是什么是无关紧要的。但是,如果 print_squares()被用于其他代码项目,也许它的返回值可能不是那么无关紧要。

是否print_squares() (或任何其他函数)需要返回其输入 ostream或不真正取决于调用代码如何使用该返回值。这里没有固定的约定。

关于c++ - 函数返回 iostream 而其参数之一也是 iostream 是强制性的还是只是约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58002581/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com