运算符重载
运算符重载其实就是函数的重载。
重载运算符的函数如下:
函数类型 operator 运算符 (形参列表)如:type operator + (argu);
//加号的重载 class oprOverload {//类的声明 public: oprOverload(int a = 2,int b = 2);//构造函数 oprOverload operator + (oprOverload &);//运算符重载函数声明(+) void display(); private: int fNum; int sNum; }; oprOverload oprOverload::operator+(oprOverload &a) {//运算符重载函数定义 oprOverload c; c.fNum =fNum + a.fNum; c.sNum =sNum + a.sNum; return c; }; int main() { oprOverload a(1,2), b(-1,-2),c;//对象声明 c = a + b;//重载后的+的调用。 a.display();//1,2 b.display();//-1,-2 c.display();//0,0 return 0; };
不能重载的运算符:. (成员访问运算符)/ .* (成员指针访问运算符)/ :: (域运算符)/ sizeof (长度运算符)/ ?: (条件运算符)
重载不能改变运算符运算对象的个数,如>的运算对象一定是两个;重载不能改变运算符的优先级,不能改变运算符的结合性,不能有默认参数,参数不能全部是C++的标准类型,必须有一种用户自定义的数据类型。
++运算符的重载分为两类,前置++和后置++,在C++中规定,给++的重载函数增加一个int型参数,即为后置++运算符重载函数。
重载流提取符(>>/<<),声明方式如下:
ostream& operator << (ostream &, myClass &);//重载<<运算符声明 istream& operator >> (istream &, myClass &);//重载>>运算符声明
下面是一个练习时用的重载类的例子,代码:
//oprOverload.h #include <iostream> using namespace std; class oprOverload { public: oprOverload(int a = 0,int b = 0);//构造函数 ~oprOverload();//析构函数 oprOverload operator + (oprOverload &);//运算符重载函数声明(+) friend oprOverload operator ++ (oprOverload &, int);//重载++运算符,int用来声明这是后置++重载函数 friend ostream& operator << (ostream &, oprOverload &);//重载<<运算符 friend istream& operator >> (istream &, oprOverload &);//重载>>运算符 void display(); private: int fNum; int sNum; };
//oprOverload.cpp #include <iostream> #include "operator_overload.h" using namespace std; oprOverload::oprOverload(int a,int b) { this->fNum = a; this->sNum = b; }; oprOverload oprOverload::operator+(oprOverload &a) {//运算符重载函数定义(+) oprOverload c; c.fNum =fNum + a.fNum; c.sNum =sNum + a.sNum; return c; //另一种实现方法 //return oprOverload(fNum+a.fNum,sNum+a.sNum);//无对象名,建立一个临时对象 }; void oprOverload::display() { cout<<fNum<<" "<<sNum<<"i"<<endl; }; oprOverload::~oprOverload() { cout<<"Destructor"<<endl; };
//主函数 #include <iostream> #include "operator_overload.h" using namespace std; //运算符重载函数(作为友元函数的存在) oprOverload operator ++ (oprOverload &a, int) {//作为友元函数的运算符重载函数(int 参数专门用来声明这是后置++的重载函数) oprOverload b = a;//定义一个oprOverload对象,用来保存自加之前的对象. a.fNum++; a.sNum++; return b;//返回自加前的对象 }; ostream& operator << (ostream &output, oprOverload &a) {//重载<<运算符 output<<a.fNum<<a.sNum; return output;//为了能够向输出流持续插入信息? }; istream& operator >> (istream &input, oprOverload &a) {//重载>>运算符 input>>a.fNum>>a.sNum; return input;//为了能够向输入流持续插入信息? }; int main() { //compare <int> com1(1,2);//类模板对象的声明 oprOverload a,b; b++; cout<<b;//输出11 cout<<a;//输出00 cin>>a;//输入1 3 cout<<a;//输出13 system("PAUSE"); return 0; };