Complex operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; } //+是双目运算符,函数重载中只有一个参数,实际上运算符重载函数有两个参数,是由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this //指针隐士的访问对象成员函数。 Complex operator+(Complex *this,Complex &c2) {return Complex(this->real+c2.real,this->imag+c2.imag);} //运算符重载函数可以作为类的成员函数,还可以作为非成员函数。例: #include<iostream> using namespace std; class Complex { public: Complex(){real=0;imag=0;} Complex(int r,int i){real=r;imag=i;} void display(); friend Complex operator+(Complex &c1,Complex &c2);//将运算符在Complex类中的成员函数 改为类的友元函数,应同时将运算符函数参数改为两个因为,this隐试指针只对类的成员函数有作用 private: int real; int imag;}; Complex operator+(Complex &c1,Complex &c2) {return Complex(c1.real+c2.real,c1.imag+c2.imag);}//Complex 保证返回值类型和该对象类型一致 void Complex::display() { cout<<"("<<real<<','<<imag<<"i)"<<endl; } int main() { Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; cout<<"c1="; c1.display(); cout<<"c2"; c2.display(); cout<<"c1+c2="; c3.display(); return 0; } //什么时候用成员函数方式,什么时候用友元函数? //如果将运算符作为成员函数,它可以通过this指针自由的访问本类的数据成员,因此可以少写一个函数的参数。但是必须要求运算表达试第一个参数(即运算符的左操作数)是类的对象。 如果将一个复数和一个整数相加,(c1+i)可以将运算符重载函数作为类成员函数: Complex Complex::operator+(int &i) return (Complex(real+i,imag);} //注意在表达式中重载的运算符,+左侧应为Complex类的对象,如c3=c2+i;不能写成c3=i+c2; //如果运算符左侧的操作对象属于C++标准类型(如int)或其他类的对象,则运算符重载函数不能作为成员函数,如果函数还必须要访问类的私有成员,则必须声明为友元函数 friend Complex operator+(int &i,Complex &c)//第一个参数可以不是类对象 //在类外定义友元函数 Complex operator+(int &i,Complex &c) {return Complex(i+c.real,c.imag);}
//C++规定,有的运算符(如赋值运算符= 、下标运算符[] 、函数调用运算符() 、 ->、new、delete )必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“<<”和流提取运算符“>>”、类型转换运算符)。