运算符重载就是重新定义C++内部对类类型的对象之间的内置运算。格式:
类名 operator+(const 类名 &p){...实现方法};
注意 :如果将运算符重载为类的友元函数(友元函数前没有访问特性的关键字,不属于类的成员),则当某些运算符遇到非类的成员的对象的时候会先在内部将该变量转换为类的对象(前提是类的构造函数提供了足够完整的构造条件),譬如以友元重载了”+“,即可以执行 “2+某个类对象”,其中2被当做第一个参数执行了构造函数并顺利生成了一个类的成员对象。 另一种方法就是将运算符重载定义为类的成员函数,这样必须是类的成员对象才能调用该重载了的运算符函数,而譬如“=”、“[ ]”等运算符必须以成员对象作为参数,最好将运算符重载成类的成员函数来力高程序的正确性。
1)运算符重载为友元函数:
class Rational{
friend Rational operator+(const Rational &p)const;
public:
...;}
2)运算符重载成成员函数:
class Rational{
public:
Rational operator+(const Rational &p)const;
...;}
--几种特殊的运算符重载:
1)赋值运算符的重载
原型: A &operator=(const A &p);
因为赋值符号是一个特殊的符号,它的左值会作为返回值返回出来。(例如在C++中可以执行语句a=b=c,就是因为“b=c”将b 的值作为了返回值才能让a被赋值)所以赋值运算符的重载函数要定义为返回类型为它本身的一个函数(一般会“return *this;”)。
另外,还要注意区分拷贝构造函数和赋值运算符的重载,前者只能用于一个只声明了未定义的类的对象的属性的初始化,后者可用于程序中的成员对象之间的赋值。
2)下标运算符的重载
原型: const 对象存储变量类型 operator[ ](i)const{ ... return this.storage[i];}
3)函数调用运算符重载
原型:函数的返回值 operator()(形式参数表);注意 :此函数必须重载成成员函数
4)++和--运算符的重载
此运算符的重载需要注意的是要区分前缀和后缀
A & operator++();//前缀++
A operator++(int);//后缀++
5)输入/输出运算符重载
输出运算符的重载:“cout<<x"的两个运算符对象分别是cout和x,<<运算符的执行结果是左边输出流对象的引用(在这里是对象cout),因此可以执行cout<<a<<b格式的语句。输出运算符的重载的框架如下:
ostream & operator<<(ostream &os,const 类名 &obj)
{ os<<要输出的内容;
return os;}
输入运算符的重载只是将输出流改成输入流istream即可。