操作符重载一般有以下几点需要注意的:
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;
}