C++ 输入/输出运算符重载
C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型。您可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型。
在这里,有一点很重要,我们需要把运算符重载函数声明为类的友元函数,这样我们就能不用创建对象而直接调用函数。
下面的实例演示了如何重载提取运算符 >> 和插入运算符 <<。
实例
#include <iostream>
using namespace std;
class Distance
{
private:
int feet; // 0 到无穷
int inches; // 0 到 12
public:
// 所需的构造函数
Distance(){
feet = 0;
inches = 0;
}
Distance(int f, int i){
feet = f;
inches = i;
}
friend ostream &operator<<( ostream &output,
const Distance &D )
{
output << "F : " << D.feet << " I : " << D.inches;
return output;
}
friend istream &operator>>( istream &input, Distance &D )
{
input >> D.feet >> D.inches;
return input;
}
};
int main()
{
Distance D1(11, 10), D2(5, 11), D3;
cout << "Enter the value of object : " << endl;
cin >> D3;
cout << "First Distance : " << D1 << endl;
cout << "Second Distance :" << D2 << endl;
cout << "Third Distance :" << D3 << endl;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
$./a.out Enter the value of object : 70 10 First Distance : F : 11 I : 10 Second Distance :F : 5 I : 11 Third Distance :F : 70 I : 10
wdb
424***[email protected]
习惯上人们是使用 cin>> 和 cout<< 的,得使用友元函数来重载运算符,如果使用成员函数来重载会出现 d1<<cout; 这种不自然的代码。
下面这个实例展示了如果运用成员函数来重载会出现的情况d1<<cout;
运行结果:
wdb
424***[email protected]
IdanSuce
275***[email protected]
如果是 d1 << cout; 的话,相当于调用了一次:
跟重载 + 运算符的调用没有什么区别,都是属于类变量的操作:
因为最后返回的还是 os,所以可以循环使用,也就是写成:
是没有问题的。
如果是 cout << d1; 就需要在类的外部定义:
这个时候调用,就相当于在整个全局声明了一个重载运算符。
调用这个重载运算符,就相当于调用了一个函数:
同样地,因为返回的是 output, 所以还是可以循环调用的。
IdanSuce
275***[email protected]
小凡
392***[email protected]
针对上述的详细解释:
在C++中,
ostream&
表示对输出流的引用。通过将输出流作为引用传递给重载的输出运算符<<
,可以使函数能够更高效地操作输出流对象,而不是创建一个新的副本。这样可以减少内存的使用和提高运行效率。在重载输出流运算符时,可以使用
const Value &d
作为参数的原因是,输出操作符不会修改被输出的对象的值。因此,可以将参数声明为const
引用,允许传递const Value
类型的对象,以及非const Value
类型的对象。然而,重载输入流运算符时情况稍有不同。输入操作符的目的是将输入的数据存储到对象中,即修改对象。因此,参数必须是非常量引用
Value &d
,以确保可以直接对参数进行修改。如果我们将输入流运算符的参数声明为
const Value &d
,那么我们无法对对象进行修改,也就无法通过输入运算符将输入的数据存储到对象中。这将导致输入操作无法成功完成。因此,在重载输入流运算符时,我们需要使用非常量引用
Value &d
,以便能够在函数内部修改对象的值并将输入的数据存储到对象中。小凡
392***[email protected]