关于<<和>>重载操作符 返回值的问题

操作符重载一般有以下几点需要注意的:

1)重载操作符必须有一个类类型的操作数,这是为了避免对已有的内置类型对象的操作符的原本含义的更改;

2)重载后的操作符的优先级和结合性是固定不变的;

3)重载操作符为类成员函数时,它的形参表中会少一个形参,原因是有一个隐含形参this,而且该this形参限定为第一个操作数;

4)当操作符为非类成员函数的时候,如果该函数需要访问类的私有数据成员,需要将该操作符设置为友元。

下面主要介绍介个常用的操作符重载模式以及需要注意的问题

一、输出操作<<的重载

其函数原型是

ostream& operator<<(ostream& os, const Classtype &object) {

                 os<<object.(数据成员名);

                 return os;

}

针对上面的操作符重载,我们给出以下解释:

该操作符重载的第一个形参类型是ostream&,原因是ostream对象不能复制,因此选择引用,ostream对象同样不能是const的,因为写入到流通长会改变流的状态。第二个形参为const Classtype的应用,原因是为了避免类对象的复制,同时输出操作不应该对对象的数据成员做修改,所以应该声明为const的。另外输出操作符要尽可能少的做格式化,而且IO操作符必须为非类成员函数,主要是为了和目前所用的形式统一,通常将其设置为类的友元。返回值类型是ostream& 类型个人认为主要是为了使用方便,适用于连写的这种方式,比如cout<<object1<<object2.........

#include <iostream>
#include <string>
using namespace std;
class student{
public:
	student():a(0),s("Hello"){};
	student(int c,string s1):a(c),s(s1){};
	student& student::operator=(student &stu)
	{
		this->a=stu.a;
		this->s=stu.s;
		return *this;
	}
	/*friend
	void operator<<(ostream& out,const student &stu)
	{
		out<<stu.a<<"\t"<<stu.s;
	}*/
	friend 
	ostream& operator<<(ostream& out,const student &stu)
	{//注意此处的形参,out不可以为const。
		out<<stu.a<<"\t"<<stu.s;
		return out;
	}
	friend 
	istream& operator>>(istream& in,student &stu)
	{//返回值必须为引用,且类形参为非const,因为要对其写入。
		in>>stu.a>>stu.s;
		return in;
	}
private:
	int a;
	string s;
};
int main()
{
	student ab(3,"I miss you");
	student stu1,stu2;
	stu1=stu2=ab;//=操作符返回值,可以为引用或者非引用,因为操作顺序是从右向做操作的。
	cout<<stu1;//即使<<操作符返回值为空值,也可以这么进行输出。但是如果想连续输出
				//就像cout<<stu1<<stu2;就必须使用返回值为ostream &的版本了,而且此时的返回值必须为引用。。
				//因为操作的顺序是从左到右,返回的引用,还可以对其赋值。如果返回非引用,ostream对象没有办法复制
	cin>>stu1;
	cout<<stu1;

	return 1;
	
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值