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

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 )必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“<<”和流提取运算符“>>”、类型转换运算符)。


原文地址:https://www.cnblogs.com/sxy201658506207/p/7586430.html