一:重载运算符:
1:重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:
①:不改变运算符的优先级
②:不改变运算符的结合性
③:不改变运算符所需要的操作数
④:不能创建新的运算符
2:运算符函数可以重载为成员函数或友元函数。
3:成员运算符函数的原型在类的内部声明格式如下:
class X {
//…
返回类型 operator运算符(形参表);
//…
}
在类外定义成员运算符函数的格式如下:
返回类型 X::operator运算符(形参表)
{
函数体
}
4: 一般而言,采用成员函数重载单目运算符时,以下两种方法是等价的:
@aa; // 隐式调用
aa.operator@(); // 显式调用
成员运算符函数operator @所需的一个操作数由对象aa通过this指针隐含地传递。因此,在它的参数表中没有参数。
5:①:在第一个参数需要隐式转换的情形下,使用友元函数重载。
②:友元函数没有 this 指针,所需操作数都必须在参数表显式。
③:C++中不能用友元函数重载的运算符有
= () [] ->
6:①:成员运算符函数比友元运算符函数少带一个参数(后置的++、--需要增加一个形参)。
②:双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但当操作数类型不相同时,必须使用友元函数。
7:①:赋值运算符重载用于对象数据的复制
②: operator= 必须重载为成员函数
③:重载函数原型为:
类名 & 类名 :: operator= ( 类名 ) ;
8:[] 和 () 只能用成员函数重载,不能用友元函数重载。
9:定义输出运算符“<<”重载函数的一般格式如下:
ostream& operator<<(ostream& out,class_name& obj)
{
out<<obj.item1;
out<<obj.item2;
.. .
out<<obj.itemn;
return out;
}
10 :定义输入运算符函数 “>>”重载函数的一般格式如下:
istream& operator>>(istream& in,class_name& obj)
{
in>>obj.item1;
in>>obj.item2;
. . .
in>>obj.itemn;
return in;
}
二:典型代码:
#include<iostream>
using namespace std;
class Increase
{ public :
Increase ( ) { value=0; }
void display( ) const { cout<<value<<'\n'; } ;
friend Increase operator ++ ( Increase & ) ; // 前置
friend Increase operator ++ ( Increase &, int ) ; // 后置
private: unsigned value ;
};
Increase operator ++ ( Increase & a )
{ a.value ++ ; return a ; }
Increase operator ++ ( Increase & a, int )
{ Increase temp(a); a.value ++ ; return temp; }
int main( )
{ Increase a , b , n ; int i ;
for ( i = 0 ; i < 10 ; i ++ ) a = n ++ ;
cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ;
for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ;
cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ;
}
三:学习心得:
重载运算符和重载函数相似,遵循函数重载的基本原则。
重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。
运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。总之通过学习运算符重载能更好的运用函数,使代码更精炼。