前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++重载操作符

C++重载操作符

作者头像
Cloudox
发布于 2021-11-23 06:15:32
发布于 2021-11-23 06:15:32
36300
代码可运行
举报
文章被收录于专栏:月亮与二进制月亮与二进制
运行总次数:0
代码可运行

什么叫重载操作符?这要先说什么是操作符,其实最简单的:+、-、*、/、<<就都是操作符,这些也是很常见的重载操作符。

那什么叫重载操作符?普通的基本类型比如int、float都可以进行加减乘除,也可以用cout<<来输出,但是我们自定义的类型是不支持的,比如如果你想这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Obje
Object obj2;
Object obj3 = obj1 + obj2;
cout<<obj3;

这是不可以的(当然不单单是因为没有初始化对象值)。也就是说,你定义的类本身不支持这些操作,那如果我想支持呢?比如我要定义一个MyTime类,时间加减很常见,输出更常见,难道我要每次都在使用时获取其成员变量自己写加减法自己一个个输出吗?其实不用那么麻烦,只要重载操作符就可以了。

那么如何重载?

重载操作符其实也是一种形式的多态,因此只能重载C++本身有的操作符,而且只能按照C++本身有的操作方式来使用,比如你对于“-”号,可以重载来用于两个对象相减,或者用于表示一个对象求负,但是你不能重载一个“@”号来用于两个对象相加,因为C++本身就没有这种用法。

重载的方法非常简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 形式如下:
operator op(argument-list)

// 比如原型:
Time oprator+(const Time &t);// 这实际上就是重载一个Time的相加的方法
// 实现:
Time Time::operator+(const Time &t) {
  // 至于怎么实现就看你自己了,一般意义上当然是时与时相加,分与分相加等等,还考虑进位
  // 注意返回值是Time类型,因为相加也是返回一个结果Time
}

这样就写好方法了,这个方法是放在Time类方法里的,调用如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Time time1 = ...
Time time2 = ...
Time time3 = time1 + time2;

这时候就可以相加了。你可能会注意到,方法定义中参数只有一个参数,实际上这个方法调用过程等于下面这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Time time3 = time1.operator+(time2);

这就是常规的方法使用方式,只不过因为是重载的操作符,所以可以如一般类型那样去直观性地使用。

因此,实际上也可以让参数不是Time类型,而是一个int:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 原型:
Time oprator+(int h);// 这实际上就是重载一个Time的相加的方法
// 实现:
Time Time::operator+(int h) {
  // 这里你可以看做是增加一小时的方法
  // 注意返回值是Time类型,因为相加也是返回一个结果Time
}

// 使用:
Time time3 = time1 + 1;

这样就可以和常规类型一起用,是不是很方便。

但是这会带来一个类型,我们现在已经知道了重载的使用方法实际上是方法调用的另一种表现形式,也就是第一个Time变量调用方法,第二个变量(不管是Time还是int都可以写类似方法)是传递的参数。

那如果我把int类型的值放在第一个呢?类似这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Time time3 = 1 + time1;

这会报错的,因为int类型并没有一个方法可以去调用Time类型参数的加法。

但是我们可以用友元函数来解决这个问题,关于友元函数是什么这里只简单介绍一下:

类的友元函数是非成员函数,因此不能用成员操作符来调用,在定义时也不需要使用::限定符,但它与成员函数的访问权限相同,也就是可以访问类的成员。声明时以friend开头,定义时不需要。

我们用友元函数来实现int在前的加法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 依然在类定义内,但因为不是成员函数,定义时不需要::限定符
// 原型:
friend Time  operator+(int h, const Time &t)

// 实现(注意没有::限定符):
Time  operator+(int h, const Time &t) {
  // 把时间加一个小时
  // 依然返回Time类型时间
}

// 此时就可以这么用了:
Time time3 = 1 + time1;

这样我们就可以各种方式来使用了。

其实重载操作符最好用的是什么?是cout<<这个操作,因为我们经常需要输出信息,但是自定义类型不能直接这么用,往往要写一长串成员变量来输出,但是我们重载一下就可以了,同样的,因为<<这个操作符的左边是cout而不是我们的类型对象,所以也要通过友元函数的方式来定义才能使用,大致方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 声明原型:
friend std::ostream & operator<<(std::ostream & os, const Time & t);

// 返回类型为ostream,则可以连续使用<<。
// 参数类型为ostream,则cout、cerr甚至子类都可以用。
// 传递的是引用而不是拷贝,保证一直是原来那个cout
ostream & operator<<(ostream & os, const Time & t) {
  os << t.hours << " hours, "" << t.minutes << " minutes";
  return os;
}

// 可以这样调用:
cout << "Time is " << time << "...\n";

是不是很方便?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/12/7 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】C++运算符重载-基础
运算符重载,如“+”,它可以对int、float、string类型进行加法运算。 “<<”是C++中的左移运算符,但是在输出操作中与cout配合被称为流插入运算符,可以进行输出。 “>>”是右移运算符,与cin配合使用被称为流提取运算符。 它们都被称为运算符重载。
谙忆
2021/01/21
4150
【C++】C++运算符重载-基础
运算符重载
流操作符>>,<<一般使用非成员函数实现,也就是友元函数实现,这样可以符合程序员的惯性思维
DeROy
2020/05/11
1K0
【C++】C++运算符重载的规则
被重载的运算符必须是已经存在的C++运算符,不能重载自己创建的运算符。 运算符被重载之后,原有功能仍然保留。只是扩展了原有功能。 重载不能改变运算符运算对象的个数。 +运算符具有两个操作数,在+运算符函数作为类(例如上个例子中的CTime)的成员函数的时候,有一个参数是隐含的,也就是当前的对象,使用this指针来引用。 另一个参数通过函数参数指定。
谙忆
2021/01/21
6830
C++输入输出操作符重载
C++中输入操作符是>>,输出操作符是<<,又叫做流对象的“插入操作符”和“提取操作符“。其实这两个操作符最初是在C语言中用于整数的移位运算,到了C++中才利用操作符重载的技术将它们应用于输入、输出操作。
恋喵大鲤鱼
2018/08/03
8170
C++笔记:运算符重载
函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,做到“一名多用”。 运算符也可以重载,在C++标准库中也使用了大量的运算符重载。例如:
DioxideCN
2022/08/05
1.5K0
C++拾趣——有趣的操作符重载
        操作符重载是C++语言中一个非常有用的特性。它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑。
方亮
2019/01/16
8450
C++:12---运算符重载
C++98,C++0x,C++11对“哪些运算符重载能够重载”有一致的规定。详细例如以下:
用户3479834
2021/02/03
6290
C++:12---运算符重载
使用重载运算符实现一个复数类(C++实验十)
实验目的: 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法
用户7886150
2021/02/08
1.6K0
【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重载
这里不需要写形参名,因为接收值是多少不重要,也不需要调用。 这个参数仅仅是为了前缀和后缀区分而存在的。
走在努力路上的自己
2024/06/07
1550
【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重载
九、运算符重载
运算符重载(Operator Overloading)是面向对象编程语言中的一种功能,它允许程序员为已存在的运算符(如 +, -, *, /, == 等)赋予新的意义,以便它们能够用于对象之间的操作。这种机制极大地提高了代码的可读性和易用性,因为它允许我们以更自然、更接近于数学表达式的方式来编写和操作对象。
用户11332765
2024/10/28
2860
【C++】操作符重载的应用——[年月日计算器] 重现
PS:加const,可以让普通变量和const变量都能调用该函数(具体知识点可见YY的C++知识合集博客,关于const的解读)
YY的秘密代码小屋
2024/01/22
1420
【C++】操作符重载的应用——[年月日计算器] 重现
C++ 操作符重载形式——成员函数 or 友元函数
操作符重载,又名运算符重载,是 C++ 多态的重要实现手段之一。通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强 C++ 的扩展功能。
恋喵大鲤鱼
2022/12/02
1.2K0
C++中运算符重载详解
在C++编程中,运算符重载是一种强大的工具,它允许程序员改变已有运算符的行为,使其适应自定义类型。这篇文章将从基础开始,逐步深入到运算符重载的高级应用,帮助你从入门到精通。
码事漫谈
2024/12/27
3150
C++中运算符重载详解
友元
友元函数 之前我们在Time类的示例中,我们重载乘法运算符的参数和其他参数不一样,因为有两种不同的类型,即Time和double类型,限制了调用的方式,我们成员函数调用的过程是b..opertaor
用户7272142
2023/10/19
1780
友元
C++从入门到精通——类的6个默认成员函数之赋值运算符重载
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
鲜于言悠
2024/04/17
2150
C++从入门到精通——类的6个默认成员函数之赋值运算符重载
【C++指南】运算符重载详解
运算符重载是指为类(或结构体)的特定运算符提供自定义实现,使其能够作用于类的对象。重载的运算符可以保持其原有的语义,也可以定义新的语义。
倔强的石头_
2024/12/06
3700
c++操作符重载
定义 运算符重载的 实质 是 函数的重载 使用意义 赋予操作符更多的意义,同一个运算符,对不同类型的操作数,所发生的行为不同是 程序更加简洁 写法格式:返回值 operator运算符(参数列表){} 重载的要求: 1、内置类型的操作符不能被重载 2、不能为内置类型定义其他的操作符 3、操作符重载不能改变操作符的优先级 4、操作数个数不能改变 重载方式: 1、类的成员方法 2、类的有友元方法 3、全局方法 注意: ++a和a++的重载区别。a++的重载方法中多一个占位参数 最好不好重载&&和||。因为无
用户2929716
2018/08/23
4850
从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载
该文章介绍了如何重载运算符在C++中,包括成员函数重载和友元函数重载。作者通过一个具体的实例,展示了如何重载加法运算符以实现两个复杂类型的加法操作。同时,文章还介绍了如何实现其他运算符的重载,如赋值运算符、自增运算符等。
s1mba
2017/12/28
1K0
C++第五弹 -- 类与对象中篇下(赋值运算符重载函数 const成员函数 取地址操作符重载函数)
本文将深入探讨C++中的运算符重载,重点讲解赋值运算符、前置/后置++运算符、取地址运算符的重载方法,以及const成员函数的定义和使用方法。通过日期类的实现示例,展示运算符重载和const成员函数在实际应用中的具体代码实现,帮助读者更好地理解和运用这些C++特性。
用户11317877
2024/10/16
990
C++第五弹 -- 类与对象中篇下(赋值运算符重载函数 const成员函数 取地址操作符重载函数)
(转载非原创)C++运算符重载介绍
C ++ 中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C ++ 中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C ++ 的可扩展性,也是C ++ 最吸引人的特性之一。
xlj
2021/07/17
8770
相关推荐
【C++】C++运算符重载-基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验