c++特殊运算符重载---流运算符重载

本文详细介绍了如何为自定义类MM实现cin和cout的流重载,包括输入流(istream)和输出流(ostream)的友元函数重载,以及如何通过引用传递和返回流对象。通过实例展示了连续输入输出操作的改进方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小知识:

cin类型和cout类型→本质是一个对象→输入、输出流的对象,分别做输入、输出

  • cin类型→是istream类的对象(inputstream)

  • cout类型→是ostream类的对象(outstream)

流运算符  >>   <<

  • <<    >>                 只能用友元函数的方式重载

  • =(赋值语句)  ()    ->(指针指向运算符)[ ]       这些运算符只能采用类的成员函数形式重载

  • .     .*      ?:( 三目运算符)    ::(作用域分辨符)       这些运算符不能被重载

class MM
{
public:
	MM(string name = "", int age = 18) :name(name), age(age) {}
protected:
	string name;
	int age;
};

int main()
{
    //创建一个对象 写一个类->想实现同样的效果,也需要做运算符重载
    MM mm;
    cin>>mm;
    cout<<mm;        //报错:没有与这些操作数匹配的<<运算符
}

小知识:

string本身也是一个类,为什么类的对象string str可以直接cout做输出呢?做输入输出自定义类型时string应该怎样做?     本质是类里面做流(运算符)重载

int main()
{
    string str("i love you");    //做了运算符重载
    cin>>str;
    cout<<str;               
}

流重载

  • 只能用友元函数的方式重载→由于要改变另一个类(cin类)的对象

  • 必须用引用,因为会修改 istream& in 这个对象,cin会修改mm也必须要传引用 

  • 重载函数可以在类中声明,类中实现&类外实现,返回值未知,可以先假设为void类型

friend void operator>>(istream& in,MM& mm);

输入流重载

class MM
{
public:
	MM(string name = "", int age = 18) :name(name), age(age) {}
	friend void operator>>(istream& in, MM& mm) 
    {
		in >> mm.name >> mm.age;
	}
protected:
	string name;
	int age;
};

int main()
{	
	MM mm;
	cin >> mm;   	
	return 0;
}

输出流重载

//做输出不需要修改形参,传不传引用都可以
friend void operator<<(ostream& out, MM& mm) 
{
	out << mm.name << "\t" << mm.age << endl;
	
}
int main()
{
	MM mm;
	cin >> mm;   	//void  operator>>(istream& in,MM& mm)
    cout << mm;	    //void  operator<<(ostream& out,MM& mm)
    return 0;
}

拓展:要输入2个怎么办?void类型的函数不能连续输入、输出→但是标准库的可以连续输入、输出:cin>>str>>num;      报错:void类型的表达式不能连续输入,由此推断表达式运行结束后返回的是一个流对象

解决方案:cin>>mm>>num;   cin>>num返回cin对象(返回输入流对象),用cin替换cin>>num→cin>>num,从而做连续操作

返回值类型必须返回引用&,不返回引用是局部变量,局部变量不能当做运算符右值

class MM
{
public:
	MM(string name = "", int age = 18) :name(name), age(age) {}

	friend istream& operator>>(istream& in, MM& mm) 
{

    in >> mm.name >> mm.age;
    return in;        //返回流对象

}
    friend ostream& operator<<(ostream& out, MM& mm)
{
	 //把数据放到流对象中去,流对象负责把数据做输出,一定会修改流对象,必须需要传&
     out << mm.name << "\t" << mm.age << endl; 
	 return out;      //返回流对象
}

protected:
	string name;
	int age;
};

int main()
{
	MM mm;
	cin >> mm;   	//istream&  operator>>(istream& in,MM& mm)
    cout << mm;	    //ostream&  operator<<(ostream& out,MM& mm)
    return 0;
}

 可以实现多次输入

int main()
{    
    string str;
    MM mm;
    cin>>str>>mm;
    cout<<str<<endl<<mm;
    return 0;

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值