C++ 重载输入输出运算符

一、为什么要重载输入输出运算符

平时可以用流 std::cout<<str<<n ; std::cin>>str>>n ; 输出、输入字符串和整型等。但是对于自定义的类,比如 Student 类,却不能直接通过 cout<<Student 或 cin>>Student 这样的形式来输出类的内容或给类赋值。为了让自定义的类也支持这样的操作,可以通过重载输出、输入运算符。

二、重载输出运算符

ostream& operator << (ostream& os,const 类& n)
{
}

1、通常情况下,输出运算符的第一个形参是一个非常量的ostream 对象的引用。(非常量是因为向流写入内容会改变其状态; 用引用是因为流对象不支持复制)
2、第二个参数一般来说是一个常量的引用,该常量是我们想要输出的类类型。(用引用是因为我们希望避免复制实参; 用常量是因为通常打印对象的时候不需要改变对象的内容)
3、输入、输出运算符都必须是非成员函数。否则,他们的左侧运算对象将是我们的类的一个对象。所以一般会声明为友元函数(friend),这样输出运算符函数也能使用类的私有成员

//假设我们定义了类Student,输出运算符函数为成员函数
class Student
{
public:
 ostream  &operator<<(ostream &os);
 ...
};
...
Student    stu;
//为了直观,用这种方式调用输出运算符函数
stu.operator<<(cout);   //stu<<cout ,显然已经错了

三、重载输入运算符

与重载输出运算符类似

四、解析返回值为什么是引用

  流操作符<<和>>,这两个操作符常常希望被连续使用。例如:当执行cout<<a<<b;时,可以等价为(cout<<a)<<b;(cout<<a)是具有新内容的流对象cout,(cout<<a)<<b就相当于(新cout)<<b,操作符左侧仍是ostream类对象cout。因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。
  可选的其它方案包括:返回一个流对象和返回一个流对象指针。
  但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。
  对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。赋值操作符=。
  这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。

五、实现代码

#include <iostream>

using namespace std;

class Point
{
	int x;
	int y;
public:
	Point(int _x=0,int _y=0)
	{
		x = _x;
		y = _y;
	}

	friend ostream& operator<<(ostream& os,const Point& p);
	friend istream& operator>>(istream& is,Point& p);
};

ostream& operator<<(ostream& os,const Point& p)
{
	return os << p.x << "," << p.y;
}

istream& operator>>(istream& is,Point& p)
{
	cout << "请输入x的值:";
	is >> p.x;
	cout << "请输入y的值:";
	is >> p.y;
	return is;
}

int main()
{
	Point p1(1,7);
	cin >> p1;
	cout << p1 << endl;
}

 

  • 26
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
重载输入输出运算符C++中常用的操作之一,可以方便地对自定义类型进行输入输出。下面是一个重载输入输出运算符的示例: ```cpp #include <iostream> using namespace std; class Complex { public: Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {} friend ostream& operator<<(ostream& out, const Complex& c); friend istream& operator>>(istream& in, Complex& c); private: double real; double imag; }; ostream& operator<<(ostream& out, const Complex& c) { out << c.real << "+" << c.imag << "i"; return out; } istream& operator>>(istream& in, Complex& c) { in >> c.real >> c.imag; return in; } int main() { Complex c1(1.0, 2.0), c2; cout << "Enter a complex number: "; cin >> c2; cout << "c1 = " << c1 << endl; cout << "c2 = " << c2 << endl; return 0; } ``` 在上面的示例中,我们定义了一个名为Complex的类,其中包含两个私有成员变量real和imag,分别表示复数的实部和虚部。然后,我们使用friend关键字定义了两个友元函数,分别是ostream& operator<<(ostream& out, const Complex& c)和istream& operator>>(istream& in, Complex& c),用于重载输出输入运算符。在这两个函数中,我们可以对Complex类型进行自定义的输出输入操作。 在main函数中,我们创建了两个Complex对象,c1和c2,分别使用默认值和用户输入的值进行初始化,并分别输出到标准输出上。当我们输入一个复数时,程序会自动调用重载输入运算符,并将输入的值存储到c2对象中。最终,程序输出了c1和c2的值,验证了重载输入输出运算符的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值