C++中重载操作符其实是一个有特殊名称的函数:关键字operator后加上想要重载的符号,重载操作符同样需要有返回值类型和形参列表。
操作符重载一般有以下几点需要注意的:
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.........
二、输入操作>>的重载
其函数原型为:
istream& operator>>(istream& in, Classtype &object) {
in>>object.(数据成员名);
if (in)
.........
else
object = Classtype();
return in;
}
这里面的形参一定是非const的引用,因为读入操作毕竟是要修改object的数据成员的。其次输入操作符重载一定要考虑输入期间的错误以及相应的处理错误。因为读入操作,任何的数据类型不符合以及文件结束或者其他的一些错误都会导致流状态的错误,因此要给予检测。
三、复制操作符=
其函数原型为:
Classtype& operator=(const Classtype &object) {
数据成员=object.(相应的数据成员名);
return *this;
}
注意复制操作符一般声明为类的成员函数,返回*this的引用。