运算符重载学习笔记
1. 首先来复习一下类的定义与使用
定义一个复数类Complex,使之能用于复数的加法运算。编写程序,求两复试之和。
//complex.h
#ifndef COMPLEX_H_
#define COMPLEX_H_
class Complex
{
private:
float re;
float im;
public:
Complex();//默认构造函数
Complex(float r,float i=0);
Complex Sum(const Complex &z)const;//Sum函数不修改对象数据成员,定义为常函数。按值传递Complex对象,功能相同,但传递引用速度更快。
void Show()const;
};
#endif
//complex.cpp
#include <iostream>
#include "complex.h"
Complex::Complex(){}
Complex::Complex(float r,float i):re(r),im(i){}
Complex Complex::Sum(const Complex z)const
{
Complex sum;
sum.re=re+z.re;//这里的re即this->re,哪个对象调用Sum函数就指向哪个对象,此例中相当于z1.re
sum.im=im+z.im;
return sum;
}
void Complex::Show()const{std::cout<<re<<"+"<<im<<"i"<<' ';}
//usecomplex.cpp
//complie complex.cpp and usecomplex.cpp together
#include <iostream>
#include "complex.h"
int main()
{
using std::cout;
using std::endl;
Complex z1(1,2);
Complex z2(3,4);
Complex total;
total=z1.Sum(z2);
z1.Show();
cout<<"+"<<' ';
z2.Show();
cout<<"="<<' ';
total.Show();
cout<<endl;
return 0;
}
2.将Complex类转换为重载的加法运算符
只要将Sum()
的名称改为operator+()
即可
调用时可以像调用Sum()那样:
total=z1.sum(z2);
也可以使用运算符表示法:
total=z1+z2;
此时运算符函数为类的成员函数
3.将运算符函数重载为类的友元函数
友元函数知识点复习:
1. 原型在类声明中声明,但它不是成员函数,不能用成员运算符调用
2. 虽然不是成员函数,但与成员函数访问权限相同
声明friend Complex operator+(float r,float i);
定义(不用写friend)Complex operator+(float r,float i){}
修改程序如下:
Complex operator+(const Complex &z01,const Complex &z02)
{
Complex sum;
sum.re=z01.re+z02.re;
sum.im=z01.im+z02.im;
return sum;
}
4.将运算符函数重载为非成员、非友元的普通函数。
重载为普通函数,就无法访问private数据成员。
那么就在public中增加set_re(),set_im(),get_re()和get_im()函数。
代码如下:
//complex.h
#ifndef COMPLEX_H_
#define COMPLEX_H_
class Complex
{
private:
float re;
float im;
public:
Complex();
Complex(float r,float i=0);
void set_re(float r);
void set_im(float i);
float get_re()const;
float get_im()const;
void Show()const;
};
Complex operator+(const Complex &z01,const Complex &z02);//声明返回Component类的对象的普通函数
#endif
//complex.cpp
#include <iostream>
#include "complex.h"
Complex::Complex(){}
Complex::Complex(float r,float i):re(r),im(i){}
void Complex::set_re(float r){re=r;}
void Complex::set_im(float i){im=i;}
float Complex::get_re()const{return re;}
float Complex::get_im()const{return im;}
void Complex::Show()const{std::cout<<re<<"+"<<im<<"i"<<' ';}
Complex operator+(const Complex &z01,const Complex &z02)
{
Complex sum;
float R=0,I=0;
R=z01.get_re()+z02.get_im();
I=z01.get_im()+z02.get_im();
sum.set_re(R);
sum.set_im(I);
return sum;
}
//usecomplex.cpp
//complie complex.cpp and usecomplex.cpp together
#include <iostream>
#include "complex.h"
int main()
{
using std::cout;
using std::endl;
Complex z1(1,2);
Complex z2(3,4);
Complex total;
total=z1+z2;
z1.Show();
cout<<"+"<<' ';
z2.Show();
cout<<"="<<' ';
total.Show();
cout<<endl;
return 0;
}