当前位置: 首页 > news >正文

C++学习笔记——运算符重载

1、什么是运算符重载

所谓重载,就是赋予新的含义。

函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。

运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。<<既是位移运算符,又可以配合 cout 向控制台输出数据。这个大家学到这,相信大家都知道了。

2、运算符号重载的本质是什么

运算符本质其实就是,通过函数实现。以下代码通过函数实现运算符“+”的重载。

#include <iostream>
using namespace std;
class complex{
public:complex();complex(double real, double imag);
public://声明运算符重载complex operator+(const complex &A) const;void display() const;
private:double m_real;  //实部double m_imag;  //虚部
};
complex::complex(): m_real(0.0), m_imag(0.0){ }
complex::complex(double real, double imag): m_real(real), m_imag(imag){ }
//实现运算符重载
complex complex::operator+(const complex &A) const{complex B;B.m_real = this->m_real + A.m_real;B.m_imag = this->m_imag + A.m_imag;return B;
}
void complex::display() const{cout<<m_real<<" + "<<m_imag<<"i"<<endl;
}
int main(){complex c1(4.3, 5.8);complex c2(2.4, 3.7); //此处调用构造函数complex(double real, double imag);complex c3;    //此处调用构造函数complex();  也解释了为什么定义声明了,两个构造函数  c3 = c1 + c2;  //c1+c2,实际上编译器将这个翻译为c1.operator+(c2),即开始调用运算符重载函数c3.display();return 0;
}

不过必须要说明的是,代码中的运算符重载函数,与普通的函数(包括构造,析构,虚函数)是存在很大的不同的。主要可以从函数命名调用方式两点来讲解:

函数命名:运算符重载函数定义和声明代码如下:

//实现运算符重载
complex complex::operator+(const complex &A) const{
    complex B;
    B.m_real = this->m_real + A.m_real;
    B.m_imag = this->m_imag + A.m_imag;
    return B;
}

红色字体标注:暂时可以理解为函数名(其实本质不是)。

  • operator 不是关键字,而是 C++ 中用于定义运算符重载函数特殊标识符(可理解为 “运算符重载的标记”)。

operator+” 整体是运算符重载函数的函数名,其构成规则是:operator + 要重载的运算符(如 +-*<< 等)。例如:

  • operator+ 表示 “重载 + 运算符的函数”;
  • operator<< 表示 “重载 << 运算符的函数”。

调用方式,如代码中注释所说的,是表达式“c1+c2”触发了调用运算符重载函数的函数。这可能会引起很多人的不理解,我们从带都是直接调用,还没遇见过,表达式触发调用?其实本质上也是直接调用,不过时编译器将“c1+c2”替换为c1.operator+(c2)。

那这时又有人会问,那替换逻辑如何触发?

我们先来看,当代码中遇到基础变量类型(int,float等)只要变量类型一致,如都是int

int a=1,b=2;

int c=a+b;

此时直接寻址取出a和b的值,计算结果存入c的计算单元。

但是遇到复杂类型数据,比如说class实例,可能每一个class实例,具备不同的成员变量,这就没办法执行加法

3、运算法重载的一些注意事项

(1) 并不是所有的运算符都可以重载。能够重载的运算符包括:
+  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |=  <<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,  ->*  ->  ()  []  new  new[]  delete  delete[]

述运算符中,[]是下标运算符,()是函数调用运算符。自增自减运算符的前置和后置形式都可以重载。长度运算符sizeof、条件运算符: ?、成员选择符.和域解析运算符::不能被重载。

2) 重载不能改变运算符的优先级和结合性。假设上一节的 complex 类中重载了+号和*号,并且 c1、c2、c3、c4 都是 complex 类的对象,那么下面的语句:

c4 = c1 + c2 * c3;

等价于:

c4 = c1 + ( c2 * c3 );

乘法的优先级仍然高于加法,并且它们仍然是二元运算符。

3) 重载不会改变运算符的性质,原有有几个操作数、操作数在左边还是在右边,这些都不会改变。例如~号右边只有一个操作数,+号总是出现在两个操作数之间,重载后也必须如此。

4) 运算符重载函数不能有默认的参数,否则就改变了运算符操作数的个数,这显然是错误的。

5) 运算符重载函数既可以作为类的成员函数,也可以作为全局函数。注意一下如果需要使用const来修饰运算符重载函数,成员函数中const需要写在最后面

http://www.dtcms.com/a/526025.html

相关文章:

  • 怎样推广网站开什么店投资小利润高
  • 基于 Prometheus + Alertmanager + Grafana + Loki 的可视化监控与告警系统搭建实战
  • 如何做一款app需要多少钱网站seo收费
  • 电商网站设计公司皆选亿企邦怎么快速排名
  • MySQL使用技巧:字段内容的替换、拼接
  • 2025年数字趋势:重塑公共服务
  • 中企动力全网门户网站微信小程序是什么框架
  • 做企业网站公司游戏客户端开发
  • RPC攻击(Remote Procedure Call Attack)是什么?
  • 广西河池住房和城乡建设厅网站dedecms视频网站模板
  • 基于AI的智能制造成本核算与报价系统 - 技术详解
  • 南阳做网站优化哪家好北京网站设计哪家公司好
  • 网站建设的技术有哪些方面西安市市政建设网站
  • 网站建设参考金利福珠宝的网站建设理念
  • 专注企业网站建设专注软件优化分享的网站
  • 阅文集团旗下哪个网站做的最好网站按钮psd
  • SWOT分析:最经典的工具,如何用出新意?
  • 金峰辉网站建设京东商城网站地址
  • 网站建设的前期投入社交平台推广方式
  • 金坛网站建设哪家好兰溪建设局网站
  • 广州番禺做网站网站要怎么做才专业
  • 中山制作企业网站centos7.2做网站
  • 通过 Grafana 使用 PromQL 查询分析观测云数据最佳实践
  • 镇江大港南站电商推广合同
  • 福田欧曼服务站小网站推荐
  • 建设单位适合去哪个网站看资料企业展厅建议做什么
  • 制造业销采协同难?销采一体化CRM打通订单与供应链全链路
  • 【Linux】Linux进程概念(三)(进程状态,僵尸进程,孤儿进程,进程优先级)
  • 【NestJS】Reflect Metadata 全解
  • 如何做搜索引擎网站淄博 做网站