一段重载<<运算符的代码
ostream& operator <<(ostream& os,Array& arr)
{
for(int i=0;i<arr.length;i++)
{
if(i==arr.length-1)
os<<arr.arr[i]<<endl;
else
os<<arr.arr[i]<<" ";
}
return os;
}
逐行解释如下:
-
ostream& operator <<(ostream& os, Array& arr)
:- 这是函数的声明部分。
ostream&
表示这个函数返回一个输出流对象的引用。 operator <<
表示我们正在重载<<
运算符。(ostream& os, Array& arr)
是这个函数的参数列表,os
是一个输出流的引用,arr
是一个Array
对象的引用。
- 这是函数的声明部分。
-
for(int i = 0; i < arr.length; i++)
:- 这是一个
for
循环,用于遍历Array
对象中的每个元素。 i
是循环变量,从0
开始,一直到i
小于arr.length
为止。
- 这是一个
-
if(i == arr.length - 1)
:- 这是一个条件语句,用于检查当前元素是否是数组的最后一个元素。
- 如果
i
等于arr.length - 1
,说明当前元素是最后一个元素。
-
os << arr.arr[i] << endl;
:- 如果当前元素是最后一个元素,将其输出到流中,并加上换行符
endl
。
- 如果当前元素是最后一个元素,将其输出到流中,并加上换行符
-
else
:- 如果当前元素不是最后一个元素。
-
os << arr.arr[i] << " ";
:- 将当前元素输出到流中,并加上一个空格
" "
。
- 将当前元素输出到流中,并加上一个空格
-
return os;
:- 函数返回输出流对象的引用,以便可以支持链式调用,例如
cout << arr1 << arr2;
。
- 函数返回输出流对象的引用,以便可以支持链式调用,例如
总结
这段代码定义了如何使用输出流运算符<<
来输出一个Array
对象的内容。它遍历数组中的每个元素,并根据是否是最后一个元素来决定输出后面是否加换行符或空格,从而确保输出的格式整齐。最终,函数返回输出流对象的引用,以支持进一步的输出操作。
使用cout
的版本
假设我们将代码中的os
替换为cout
,代码如下:
ostream& operator <<(ostream& os, Array& arr)
{
for(int i = 0; i < arr.length; i++)
{
if(i == arr.length - 1)
cout << arr.arr[i] << endl;
else
cout << arr.arr[i] << " ";
}
return os;
}
区别和影响
-
输出目标固定为标准输出:
使用cout
后,输出目标固定为标准输出(通常是控制台)。这意味着无论你使用哪个输出流调用这个重载运算符,例如cout << arr;
或ofstream file("output.txt"); file << arr;
,输出始终会打印到控制台,而不是目标输出流。 -
灵活性降低:
原始版本使用os
作为参数,可以将输出定向到任何输出流,例如标准输出(cout
)、文件输出流(ofstream
)或其他自定义输出流。这提供了更大的灵活性。例如:
如果将cout << arr; // 输出到控制台 ofstream file("output.txt"); file << arr; // 输出到文件
os
替换为cout
,上面的第二种情况(输出到文件)将无法正常工作。 -
代码重用性降低:原始版本可以在不同的上下文中复用,适应多种输出需求。替换后只能用于输出到控制台,减少了代码的重用性
结论
将
os
替换为cout
会导致输出目标固定为标准输出,减少了代码的灵活性和重用性。为了保持代码的通用性和灵活性,通常应保留os
参数,并避免在重载的<<
运算符函数中直接使用cout
。