operator C++ 操作符重载

c++ operator百样操作符重载(详解) 文章介绍了c++关于操作符重载的详细内容 二、operator = : 等号赋值重载 三、operator != : 不等于重载 四、operator> : 大于号 或者 小于号重载 五、operator << :输入重定向重载 六、operator >>:输出重定向重载 七、operator +:加号重载 八、operator ++ :++重载 九、operator -- :--重载 阅读详情

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。

   这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。

 

 一、为什么使用操作符重载?
对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义的class,如果想支持基本操作,比如比较大小,判断是否相等,等等,则需要用户自己来定义关于这个操作符的具体实现。比如,判断两个人是否一样大,我们默认的规则是按照其年龄来比较,所以,在设计person 这个class的时候,我们需要考虑操作符==,而且,根据刚才的分析,比较的依据应该是age。那么为什么叫重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,所以,需要用户自己来提供该参数版本的实现。

 

二、如何声明一个重载的操作符?
A:  操作符重载实现为类成员函数
重载的操作符在类体中被声明,声明方式如同普通成员函数一样,只不过他的名字包含关键字operator,以及紧跟其后的一个c++预定义的操作符。
可以用如下的方式来声明一个预定义的==操作符:
class person{
private:
    int age;
    public:
    person(int a){
       this->age=a;
    }
   inline bool operator == (const person &ps) const;
};
实现方式如下:
inline bool person::operator==(const person &ps) const
{

     if (this->age==ps.age)
        return true;
     return false;
}
调用方式如下:
#include
using namespace std;
int main()
{

  person p1(10);
  person p2(20);
  if(p1==p2) cout<<”the age is equal!”< return 0;
}
这里,因为operator ==是class person的一个成员函数,所以对象p1,p2都可以调用该函数,上面的if语句中,相当于p1调用函数==,把p2作为该函数的一个参数传递给该函数,从而实现了两个对象的比较。

B:操作符重载实现为非类成员函数(全局函数)
对于全局重载操作符,代表左操作数的参数必须被显式指定。例如:
#include
#include
using namespace std;
class person
{
public:
int age;
public:
};

bool operator==(person const &p1 ,person const & p2)

//满足要求,做操作数的类型被显示指定
{
if(p1.age==p2.age)
return true;
return false;
}
int main()
{
person rose;
person jack;
rose.age=18;
jack.age=23;
if(rose==jack)
cout<<"ok"< return 0;
}

 

 

C:如何决定把一个操作符重载为类成员函数还是全局名字空间的成员呢?
①如果一个重载操作符是类成员,那么只有当与他一起使用的左操作数是该类的对象时,该操作符才会被调用。如果该操作符的左操作数必须是其他的类型,则操作符必须被重载为全局名字空间的成员。
②C++要求赋值=,下标[],调用(), 和成员指向-> 操作符必须被定义为类成员操作符。任何把这些操作符定义为名字空间成员的定义都会被标记为编译时刻错误。
③如果有一个操作数是类类型如string类的情形那么对于对称操作符比如等于操作符最好定义为全局名字空间成员。

 


D:重载操作符具有以下限制:

(1) 只有C++预定义的操作符集中的操作符才可以被重载;


(2)对于内置类型的操作符,它的预定义不能被改变,应不能为内置类型重载操作符,如,不能改变int型的操作符+的含义;

(3) 也不能为内置的数据类型定义其它的操作符;

(4) 只能重载类类型或枚举类型的操作符;

(5) 重载操作符不能改变它们的操作符优先级;

(6) 重载操作符不能改变操作数的个数;

(7) 除了对( )操作符外,对其他重载操作符提供缺省实参都是非法的;

 

 

E: 注意点
(1)后果载操操作符首先要确定它的返回值是左值,还是右值,如果是左值最返回引用,如果是右值那就直接返回值;

(2) +号等这样的操作符没有对象可以容纳改变后值,对于这样的情况最好返回数值,否则只能要操作符体内创建临时对象用于容纳改变后的值,如果在堆中创建临时对象返回指针或者引用,在操作符函数体外还需要释放它,如果返回的对象而不是引用或者指针,那么效率是比较低的。如果返回的是数值,最好在该类的构造函数中增加对该类型数值的转换函数,如:返回值是int类型,那么最好有一个int类型作为参数的构造函数。

(3)在增量运算符中,放上一个整数形参,就是后增量运行符,它是值返回,对于前增量没有形参,而且是引用返回,示例:

class Test

{

    public:

    Test(x=3){ m_value = x}

    Test &operator ++();   //前增量

    Test &operator ++(int);//后增量

private:

    Int m_value:

};

Test &Test::operator ++()

{

    m_value ++;    //先增量

    return *this;  //返回当前对象

}

Test Test::operator ++(int)

{

    Test tmp(*this);  //创建临时对象

    m_value ++;       //再增量

    return temp;      //返回临时对象

}

(4)因为强制转换是针对基本数据类型的,所以对类类型的转换需自定义;

(5) 转换运行符重载声明形式:operator 类型名();它没有返回类型,因为类型名就代表了它的返回类型,所以返回类型显得多余。

(6)一般来说,转换运算符与转换构造函数(即带一个参数的构造函数)是互逆的,如有了构造函数Test(int),那么最好有一个转换运算符int()。这样就不必提供对象参数重载运算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2;就不需要重载+号操作符了,因为对于a1+a2的运算,系统可能会先找有没有定义针对Test的+号操作符,如果没有,它就会找有没有针对Test类转换函数参数类型的+号操作符(因为可以将+号运行结果的类型通过转换函数转换为Test对象),因为Test类有个int类型的参数,对于int类型有+操作符,所以a1+a2真正执行的是Test(int(a1) + int(a2));即Test(3);

(7)对于转换运算符,还有一个需要注意的地方就是,如果A类中有以B为参数的转换函数(构造函数),那B中不能有A的转换运算符,不然就存在转换的二义性,如:

class A{A(B&){…}}; class B{ operator A(){…}};那么以下语句就会有问题:

B b; A(b);//A(b)有就可能是A的构造函数,也可以是B的转换运算符

C++之operator关键字(重载操作符) 使用总结 operator是C++的关键字,它和运算符一起使用,表示一个运算符函数, 一、为什么使用操作符重载 简单的说我们基本数据比如int float 都可以比较大小 有>、、 二、实现重载的操作符 先看简单代码类成员函数实现重载和非类成员函数(全局函数) 1)、操作符重载实现为类成员函数 重载的操作符在类体中被声明,声明方式如同普通成员函数一样,只不 阅读详情

相关推荐

2006NOIP普及组真题 4. 数列

从上述推理中,我们发现要输出的幂次和中的第 N 项(也就是幂次和中的序号N),对应的二进制位数和幂次和对应的二进制位数相同。当 k=3 时,k的幂次为1, 3, 9, 27, 81…,即第0位,第2位均为1,转成 k 进制(k=3)时。,即第2位,第3位均为1,转成 k 进制(k=3)时。转成 k 进制(k=3)时的幂次和为。,即第0位,第1位,第2位均为1,(即第0位,第1位,第2位均为1)N=12时,12的二进制是。(即第0位,第2位均为1)(即第2位,第3位均为1)结论:这道题就变成了。

weixin_40252159的博客 1514

C++

值,引用,指针: http://zhidao.baidu.com/question/52947711.html #include #include void fun1(int a,int b); void fun2(int& a,int& b); void fun3(int* a,int* b); void main() { int x=5,y=10; cout<<

rangf的专栏 1023

APS生产排程系统——ERP、MES、APS系统的关联和区别

APS生产排程系统——ERP、MES、APS系统的关联和区别

这里有一只小马吖 2万+

数据结构中的运算符重载函数operator的简单用法与案例

当看到一些题解时,会发现优秀的解法有时候会出现数据结构中加重载函数operator的情况,故而我详细了解了一下此函数的用法及举例一些案例 operator () { }关于这一点在的文章中已经讲的非常清楚了,希望大家可以从中得到帮助。提示:算法竞赛常用的函数,真的必须掌握hh。

2301_78799455的博客 2049

echarts实现折线图上下限区域展示

效果图: 画这种区域中主要是利用了series的两个属性: 思路:上下限都画上区域,然后折线利用图形透明度隐藏,给上区域加上颜色,给下区域加上白色(echarts图背景是啥色,就加啥色) lineStyle: { opacity: 0 }, // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形 areaStyle: { color: 'rgba(0,122,255,0.1)' }, // 填充的颜色 我的需求是最大天数、最小天数、

小太阳的博客 1万+

GPU运维工程师入门指南 (第九篇): 高性能网络 - InfiniBand与RDMA技术

本文介绍了支撑AI分布式训练的高性能网络技术InfiniBand和RDMA。传统TCP/IP网络因内核开销和内存拷贝成为性能瓶颈,而InfiniBand提供高带宽、低延迟的专用网络,RDMA则通过内核旁路和零拷贝技术实现节点间内存直接访问,显著提升通信效率。特别介绍了GPUDirect RDMA技术,使GPU显存可直接通信。文章还列举了运维人员在部署这些技术时需要考虑的硬件、驱动、配置和监控等关键点。这些技术共同构成了支撑大规模AI集群的"数据高速公路",为后续讨论存储性能瓶颈奠定了基础

weixin_42587823的博客 1098

运算符重载函数operator的简单用法与常用案例

operator运算符重载参数解释 + 案例:1. 重载+号,返回值类型的使用,2. 重载

weixin_74292291的博客 6117

Keil 5安装教程(C51与MDK共存)

目录前言MDK的安装C51的安装安装完成后的验证新建C51工程添加C51程序文件编译测试总结 前言 本篇文章将介绍嵌入式开发工具Keil 5的安装方法,并使MDK(Microcontroller Development Kit,开发stm32时会用到)和C51(51单片机C语言软件开发系统)共存。今后使用Keil 5可同时开发51单片机程序和ARM单片机程序,便于学习与从51到32的过渡。 注: 为防止商业纠纷,本篇文章不涉及文中软件的注册破解,请支持正版。 同时为了便于今后更深入的学习,本文不会介绍软件的

xushu_me的博客 6万+

结构体内重载operator =;结构体重载输出运算符<<

【代码】结构体内重载operator =;结构体重载输出运算符<<

qq_37542753的博客 870

LTE网络下的SMS收发(SMS Over SGs方案的详细流程)

关键词: IMS,SMS, LTE, MSC, MME, EPS,eNodeB, SMS Over SGs, SMS Over IMS 2G时代由于采用了比较复杂的CS/PS域架构,所以SMS(短信)作为上个世纪的产物,一直寄居在2G的CS域架构下。看看核心网的配置,其实SMS的收发还是比较复杂的。 介绍下面的信息之前你需要去百度一下这些关键词,这里我只说明比较重要的三个单元 MS 移动终端...

kevin的博客 2万+

DrMOS电路仿真

将驱动电路与功率MOS集成化后既是DrMOS。把驱动芯片以及上下桥MOSFET封装在一起,这样每一相供电就有了单独的驱动芯片,并且这种高度整合的MOSFET可以通过更高的电流、发热比传统的MOSFET也小很多且更节能 自举升压同步BUCK高低侧栅驱动电路原理及仿真 ...

Srambler的博客 5041

C++ 结构体中赋值语句,重载运算符operator 介绍

示例代码: struct PPoint { double x;//坐标点x坐标 double y;//坐标点y坐标 PPoint(double _x, double _y) :x(_x), y(_y) {}; PPoint() :x(0), y(0) {}; PPoint(const PPoint &other) :x(other.x), y(other.y) {}; const PPoint operator=(const PPoint& p) { x = p.x;

UAreSuchAJenius的博客 5074

自动驾驶关键技术(一):时间敏感网络TSN

时间敏感网络TSN的基本概念、协议族介绍和开发流程。

3080

C++中operator关键字(重载操作符)

C++中operator关键字(重载操作符)

ken2232的博客 2637

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

通俗理解C++ operator(重载操作符)

如何理解operator(重载操作符)? operator是C++的重载操作符关键字,其作用就是对操作符重新定义,使其能够适应其他不同数据类型的运算。 简单点说,就是“+”本来是算数运算符,一般用于基本数据类型,但是想要运算用户定义的数据类型class(在class可能会含有多种数据类型),这时候用重载运算符就可以将两个对象进行操作。 实现函数如下 mycomplex operator...

佳大先生的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++操作符重载:operator

对于正常情况,一元运算符(具有一个输入)建议作为成员函数,二元运算符(具有二个输入)建议为友元函数。::?这些操作符不能重载。这些操作符不能作为友元重载。>这些操作符通常建议作为友元重载,否则无法实现流的连续调用。

Dream_No_More的博客 478

C++操作符重载手册 C++ Operator Overloading

一、重载规则 I.可以重载的操作符 +-*/%^&|~!=>+=-=*=/=%=^=&=

686

c++ operator操作符的两种用法:重载和隐式类型转换

转载自:https://www.cnblogs.com/yangxudong/p/3872053.html C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换。对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式转换,我们下面就用以下这个小例子温故一下这两种用法: #include &lt;iostre...

mayue_web的博客 1132

C++ operator 重载操作符

operator是c++中的重载操作符,可对操作符进行重载,将operator=作为一个整体进行运算。运算的数据类型是用户自定义的数据类型class。 声明一个重载运算符 运算符重载实现为类成员函数 class person{ private: int age; public: person(int a){ this-&gt;age = a; } ...

kalp_yp 662

C++学习笔记-operator关键字:重载与自定义操作符

操作符重载是C++语言的一个特性,它允许你重新定义或“重载”已存在的操作符(如+、-、*、/等)在特定类型上的行为。这意呀着,你可以为自定义类型(如类)定义这些操作符如何工作,使得它们能够像内置类型那样进行算术运算或逻辑操作。

chen_mp的博客 2072

C++ 操作符重载Operator

这样,就会支持18+a的重载,可以看到有两个参数,因为不是成员函数,所以需要显式指定两个参数,int num为左侧类型,myInt m为右侧类型,这样当int res=18+a,根据参数类型调用指定的重载。是不合法的,没有与之匹配的重载,所以这里有着严格的要求,包括+号是二元操作符,只能有左右两个参数,你不能像这样int operator+(int num,int num1) 去定义它。操作符重载也是一样,有类型限制的,你调用的是哪个类对象的+号,它就会执行相应的这个类对应的重载代码。

d3582077的专栏 1248

C++进阶之操作符重载函数operator[]:用法实例(四百三十五)

本篇目的:C++操作符重载函数operator[]用法实例基本概念operator[]作为成员函数,把对象当数组使用,接收索引返回引用,支持读写及越界策略。功能实现随机访问、下标检查、惰性创建、代理对象,可返回普通引用或嵌套代理类。使用限制必须为成员函数;单参数对应索引;返回值常设计为引用以支持赋值;不可为静态。性能特性编译器内联后与裸数组同速;边界检查可在调试期启用;代理类可延迟计算。使用场景自定义矩阵、安全数组、稀疏表、缓存容器、多维数据包装。关键字功能描述典型应用。

Android系统攻城狮 680

C++ --- 重载操作符(operator)

C++的重载操作符(operator)介绍 1 简介 operator 是C++的一个关键字,它和运算符(如=)一起使用,表示一个运算符重载函数,在理解时可将operator和运算符(如operator=)视为一个函数名。 使用operator重载运算符,是C++扩展运算符功能的方法。使用operator扩展运算符功能的原因如下: 使重载后的运算符的使用方法与重载前一致 扩展运算符的功能只能通过...

xihuanzhi1854的博客 233

C++的重载操作符(operator)介绍

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33875839的博客 142
上一篇: sql的like区分大小写
下一篇: snprintf、stringstream、strstream的对比分析
beyondlpf
博客等级 码龄18年 103粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值