C++核心技术篇(六)

运算符的重载

算术运算符的重载
在前面的内容中曾介绍过string类型的数据,它是C++标准模板库提供的一个类。string类支持使用加号“+”连接两个string对象。但是使用两个string对象相减却是非法的,其中的原理是C++所提供类中重载运算符的功能。在string类中定义了运算符“+”和“+=”两个符号的使用方法,这种方法的实质是一种成员函数。
关键字operator是专门实现类算符重载的关键字。在类成员中,定义一个这样形式的函数:

返回值类型 operator 重载的运算符(参数列表)

一=以box类为例,我们可以将加号“+”重载,之后获得一个更大的盒子。
重载加号运算符
box.h的代码如下:

class box{
public:
  //类成员变量
  float m_lenth;
  float m_width;
  float m_hight;
  int Number;
  //类成员函数
  box(float lenth,float width,float hight);
  box();
  box(const box& b);
  bool Compare(const box b) const;
  void ToCheck();
  void Rebuild (float lenth,float width,float hight);
  box operator+();
  };
  

在box,cpp中添加实现部分的代码如下;

box::operator+(const box b) const{
   box box1(
   this->m_lenth+b.m_lenth;
   this->m_width+b.m_width;
   this->m_hight+b.m_hight;
   );
return box1;
}
box::box(const box& b){
this->Rebuild(b.m_lenth,b.m_width,b.m_hight);
cout<<"盒子的复制品创建"<<endl;
}

main.cpp程序入口的代码如下:

#include"stdafx.h"
#include"box.h"
#include<iostream>
usng std::cout;
using std::endl;
using std::cin;
int main(){
const box boxA(3.2f,3.3f,3.4f);
const box boxB(4.1f,7.132f,6.094f);
box boxC=boxA+boxB;
boxC.ToCheck();

}

首先创建两个box对象,使用box类定义的重载运算符加号将boxB作为参数传到函数中。这是产生复制对象,函数返回一个box对象,他的长宽高是boxA,boxB的和。boxC以这个返回值初始化,调用复制构造函数,最后输出的是boxC的长、宽、高。

比较运算符的重载

除了加减乘除运算符外,比较运算符也可以被重载。根据比较运算符的运算规则,在重载时最好贴近他们的定义
重载比较运算符
box.h的代码如下:

class box{
public :
//类成员变量
float m_lenth;
float m_width;
float m_hight;
int Number;
//类成员函数:
box(float lenth,float width,float hight);
box();
box(const box& b);
bool Compare(const box b) const;
void ToCheck();
void Bebuild(float lenth,float width,float hight);
box operator+();
bool operator>(const box b) const;
bool operator <(const box b) const;
};
在box.cpp中添加实现部分的代码如下:

```java
bool box::operator>(const box b) const{
return (m_lenth>b.m_lenth)&(m_width>b.m_width)&(m_hight>b.m_hight);
}
bool box::operator<(const box b) const{
return (m_lenth<b.m_lenth)&(m_width<b.m_width)&(m_hight<b.m_hight);
}

程序入口main.cpp的代码如下:

#include"stdafx.h"
#include"box.h"
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
int main(){
box boxA(4.44f,3.33f,5.55f);
box boxB(14.44f,13.33f,15.55f);
box boxC(24.44f,3.33f,1.55f);
if(boxA>boxB){
cout<<"盒子A能够完全容纳盒子B"<<endl;
}
else if(boxA<boxB)
   cout<<"盒子B能够完全容纳下盒子A"<<endl;
else  
cout<<"这两个盒子不能相互容纳"endl;
if(boxC>boD){
cout<<"盒子C能够完全容纳盒子D"<<endl;
}
else if(boxA<boxB)
   cout<<"盒子D能够完全容纳下盒子C"<<endl;
else  
cout<<"这两个盒子不能相互容纳"endl;
return 0;
}

依据比较运算符的重载定义,程序共执行了4次比较。
除此之外,逻辑运算符、位运算符、赋值运算符(=,+=)调用运算符(即())等都可以被重载。
赋值运算符被重载会失去原来的定义,转为重载运算符函数。在重载算符时,最好贴近将算符应用于参数、成员变量等,使算符的意义与重载的意义相近。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茫渡。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值