10.2 运算符重载函数作为类成员函数和友元函数

来源:互联网 发布:iphone自动切换网络 编辑:程序博客网 时间:2024/06/06 01:19
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 )必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“<<”和流提取运算符“>>”、类型转换运算符)。


0 0
原创粉丝点击