运算符重载:
(1)运算符重载的实质是函数重载;
(2)可以重载为普通函数,也可重载为成员函数
必要性
C++中预定义的运算符的操作对象只能是基本的数据类型。对于许多用户自定义类型,也需要类似的运算操作。则必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。
运算类型
一元运算:成员函数有无参数;友元函数有一个参数。
二元运算:成员函数有一个参数;友元函数有两个参数。
重载类型
(1)用成员函数重载
(2)用友元函数重载
(1)成员函数与友元函数重载
#include <iostream>
using namespace std;
class Complex{
public:
Complex(double r=0.0,double i=0.0)//构造函数
{real=r;imag=i;}
void display(){
cout<<"("<<real<<","<<imag<<")"<<endl;}
Complex Cadd(Complex &c1){
Complex c;
c.real=c1.real;c.imag=c1.imag;
return c;}
Complex Crev(){
return Complex(-real,-imag);}
friend Complex Cminus(Complex &c1,Complex &c2);
friend Complex Crevf(Complex &c);
private:
double real;
double imag;};
Complex Cminus(Complex &c1,Complex &c2){
Complex c;
c.real=c1.real-c2.real;
c.imag=c1.imag-c2.imag;
return c;}
Complex Crevf(Complex &c){
return Complex(-c.real,-c.imag);}
int main()
{
Complex c1(2,3),c2(1,5),c;
c=c1.Cadd(c2);
c.display();
c=Cminus(c1,c2);
c.display();
c=c1.Crev();
c.display();
c=Crevf(c1);
c.display();
return 0;
}
定义
类型 类名::operator op(参数表){
//相对于定义的操作}
1、一元运算符
object op或op object
重载为成员函数,解释为:
object.operator op()
操作数由对象object通过this指针隐含传递
重载为友元函数,解释为:
operator op(boject)
操作数由参数表的object提供
2、二元运算符
objectL op objectR
重载为成员函数,解释为:
object.operatora op()
操作数由objectL通过this指针传递,右操作数由参数objectR传递
重载为友元函数,解释为:
operator op (objectL,objectR)
左右操作数都由参数传递
(2)重载运算符
#include <iostream>
using namespace std;
class Complex{
public:
Complex(double r=0.0,double i=0.0){
real=r;imag=i;}
Complex operator + (Complex c1);
Complex operator - (Complex c1);
void display();
private:
double real;
double imag;};
Complex Complex::operator + (Complex c1){
Complex c;
c.real=real+c1.real;
c.imag=imag+c1.imag;
return c;}
Complex Complex::operator - (Complex c1){
Complex c;
c.real=real-c1.real;
c.imag=imag-c1.imag;
return c;}
void Complex::display(){
cout<<"("<<real<<","<<imag<<")"<<endl;}
int main()
{
Complex c1(5,4),c2(2,10),c3;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
c3=c1-c2;
cout<<"c3=c1-c2=";c3.display();
c3=c1+c2;
cout<<"c3=c1+c2=";
c3.display();
return 0;
}