搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
酷酷是懒虫
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
uni-icons 组件出现undefined_u-icon undefined
2
计算机博士两篇一区两篇会议,本科博士联手!西电陈渤团队两篇论文被顶级会议录用...
3
Python学习路线?从入门到精通的完整指南!_python测试开发学习路线
4
Java 中的 switch 语句:类型支持与限制
5
vue3+swiper实现层叠式轮播_vue3堆叠卡片轮播图插件
6
如何不翻墙就能正常访问GitHub_国内稳定访问github的方法
7
数据结构——链表_遍历链表
8
Spark(29)-Spark Shell及编写Spark独立应用程序_虚拟机spark独立应用程序编程
9
{Android}参加阿里完面试后:一到HR四面,我的复盘经验总结!_阿里实习hr面试
10
windows环境下玩转zookeeper_zk windows启动访问界面
当前位置:
article
> 正文
赋值和算术运算符的重载(2):算术运算符 +_返回const对象的普通函数重载算术运算符
作者:酷酷是懒虫 | 2024-07-17 05:33:50
赞
踩
返回const对象的普通函数重载算术运算符
2. 算术(arithmetic
)运算符
延续上一篇的 string 类,
+ 运算符重载函数应该这样写:
const string operator + (const string &s);
下面解释为什么。
2.1 重载函数的参数类型
当你对objects 进行+、-、*、/、% 等运算的时候,你通常不会希望改变两个操作数。
以 string 类为例:
string s1("I want "), s2("your voice"), s3;
s3 = s1 + s2;
// s3 == "I want your voice"
我相信没有人会认为 s1 + s2 操作之后,s1、s2 应该发生变化吧,我们只是想得到他们运算的结果而已。
保证不改变传入的对象,并且不用调用构造函数的方法你是否还记得?是的,它正是高贵冷艳的 reference-to-const,也就是常引用。在前一篇里的
1.1小节
详细介绍了这么做的好处。
2.2 重载函数的返回类型
返回类型最好是常对象:
const string operater + (const string &s);
2.2.1 为什么不用常引用作为返回类型?
前面说了常引用作为参数类型或返回类型不会构造副本,因此不需要调用构造函数,是相对高效的。
但是这里如果用了常引用会发生什么呢?
引用是一个对象的别名,
没有对象,引用将是没有意义的。
就好比小明的外号叫“朱大常”,用“朱大常”来代表小明,那么肯定要先有小明,才能用一个代号来代替他呀。
若 + 运算符返回一个常引用,那么这个引用代表的对象是谁?传入重载函数的是两个操作数,不能被更改,当然也就不能用来储存运算结果。那么运算结果肯定得储存在重载函数中构造的某个对象中,然后返回这个对象的常引用。
你可能需要一个局部变量来储存 + 运算的结果,然后将其返回:
const string &string::operater + (const string &s)
// 返回常引用,危险动作!
{
string r;
// Store the result of s1 + s2 in object r
......
return r;
}
如果返回常引用,就相当于把局部对象 r 交给了调用者。
局部对象呐!!运算符重载函数的调用一结束局部对象就会被自动销毁的呐!!
如果你的 string 类有个成员函数用来输出对象:
void print() const;
你若想计算 s1 + s2 的值并直接输出,考虑这样的调用会发生什么:
(s1 + s2).print();
s1 + s2 返回了一个局部对象的引用,退出函数后局部对象立马被销毁,引用的对象已经不在了,引用已经没有存在的意义了,却还用这个引用调用成员函数。这就是传说中的
未定义行为
,后果是很严重的。
返回常对象就可以解决这个问题。
在重载函数里的局部变量 r 被返回时,程序会构造一个 r 的副本并返回,r 被销毁,副本还在,副本会调用 print 函数输出相加的结果,然后副本也默默的被销毁了。世间万物又恢复了平静。
2.2.2 为什么不用普通对象作为返回类型?
string string::operater + (
const string &s
)
// 返回普通对象
之所以用常对象而不是普通对象,是为了避免下面这种情况:
(s1+s2) = s3; // 对 s1 + s2 的运算结果赋值,毫无意义
你可能会说,谁会这么无聊写这种代码。事实上这是C/C++中最容易犯的错误之一,把上面的语句放到别的地方你就明白为什么会写出这种东西来了:
if ( (s1 + s2) = s3 ) // 其实是想写 (s1+s2)== s3,想做个比较
{
...
}
你是不是也写过这样的代码呢? 我是被这种情况虐了好几回,误把 == 写成 = ,据说有些编译器会给你个警告,但很多编译器是不会提示的,因为这里并没有语法错误。
若算术运算符返回的是个常对象,常对象是不允许被修改的,赋值操作是不允许有的,那么一旦你写出上述的代码,编译器会立马 yell at you,从而避免这种粗心导致的错误。
2.3 小结一下
算术运算符如 +、-、*、/、% 、&、|、~ 等等,最好用常引用作为函数参数,常对象作为返回值:
const string operator + ( const string &s );
声明:
本文内容由网友自发贡献,转载请注明出处:
【wpsshop】
推荐阅读
article
喜讯 | 2022-2023年度最佳
科创
力
企业
榜单揭晓
,
华院
计算
为
科创
企业
“
引力
未来”...
本次论坛由工信部中小
企业
发展促进中心作指导单位
,
上海临港控股股份有限公司、上海临港联合发展有限公司、临港常熟绿洲芯城、科...
赞
踩
article
Text
2
SQL
论文-03:
Type
SQL
Knowledge-based
Type
-Aware N...
原文链接:https://blog.csdn.net/lizhilikjgcisdgf/article/details/...
赞
踩
article
matlab
一般绘图功能
_
matlab
中
drawpic
函数
的
用法
...
matlab
中一些简单图形的绘制
_
matlab
中
drawpic
函数
的
用法
matlab
中
drawpic
函数
的
用法
...
赞
踩
article
猿大师
CAD
助手帮你网页内嵌
Auto
CAD
/
Solidworks
,
在线
编辑
DWG
/DXF_
在线
cad
...
猿大师发布了
CAD
助手,一款基于其中间件的网页组件,支持2D和3D工程图纸
在线
编辑,调用原生软件确保格式兼容性和性能。此...
赞
踩
article
详解
const
重载
_
const
函数
重载
...
详解C++函数
重载
中
const
重载
的场景。_
const
函数
重载
const
函数
重载
...
赞
踩
article
深入对比:
Transformer
与
RNN
的
详细解析
_
transformer
和
rnn
...
RNN
是一种处理序列数据
的
神经网络。它
的
特点是网络中存在着循环结构,使得网络能够持有一定
的
“记忆”。这使得
RNN
特...
赞
踩
article
【
数据结构
】
哈希
桶...
哈希
桶的模拟实现_
哈希
桶
哈希
桶 目录 前言: 开散列(
哈希
桶) 开散列的概念
哈希
桶的模...
赞
踩
article
C++
中的
多态
:
虚
函数
与
纯
虚
函数
详解...
在
C++
中,
虚
函数
是在基类中使用virtual关键字声明的
函数
。当基类指针或引用指向派生类对象时,调用
虚
函数
将执行派生类...
赞
踩
article
酒店
行业
开发
小
程序
可以满足哪些
需求
_
酒店
小
程序
开发
需求
表...
现如今人们出行外出基本都会选择在
酒店
住宿,
酒店
行业的市场
需求
也越来越饱满,随着
小
程序
的飞速发展,不少
酒店
商家开始通过...
赞
踩
article
让
照片
动
起来
的
软件
有哪些?来试试下面这几款吧_图片流
动
特效
的
软件
...
随着现在技术
的
飞速进步,已经有许多
软件
可以让你
的
照片
不再是个死板
的
静态画面了,想象一下,你
的
自拍像个小电影一样,火花四溅...
赞
踩
article
BPAA
第四届
全球应用
算法
典范
大赛
TOP
50
榜单
出炉_bpaa
第四届
...
本文主要介绍了
BPAA
第四届
全球应用
算法
典范
大赛
TOP
50
榜单
出炉,希望对学习大语言模型的同学们有所帮助。文章目录1....
赞
踩
article
微软
多部门
联合推出
Graph
RAG
项目:
全面性
和多样性方面显著优于原生大模型
RAG
_
微软
graphr...
传统的
RAG
方法适用于局部文本检索任务,但。_
微软
graphrag
微软
graphrag
...
赞
踩
article
【大数据作业03】
MapReduce
的
过程分析_
map
reduce
计算
模型
的
核心
是
map
函数
和red...
5.
MapReduce
计算
模型
的
核心
是
Map
函数
和Reduce
函数
,试述这两个
函数
各自
的
输人、输出以及处理过程。6.试...
赞
踩
article
WAIC2024
:
图像
内容
安全
黑科技助力可信AI发展_
图像
安全
领域
_2024
图像
篡改
检测...
近期,合合信息相关产品接连获得中国信通院在智能文档处理、OCR智能化
领域
的高分评级。智能文档处理系统评估结果显示,AI核...
赞
踩
article
喜讯|华院计算
法律
大
模型
入围《2024
大
模型
典型示范
应用
案例
集》...
该
案例
集由中国信通院华东分院、上海人工智能实验室主导,以产业化为导向,旨在推出具有行业影响力的
大
模型
领域权威结果,展现最...
赞
踩
article
linux
远程
xdmp
设置,
Linnx
环境下
常用命令
...
1、进入某个文件夹cd /root/webBopFile/release2、启动sh start.sh运行文件3、1,启...
赞
踩
article
关于
Linux
系统
学习
心得
总结
(基础篇)_网络操作
系统
总结
与
心得
...
关于
Linux
系统
学习
心得
总结
1,什么是
Linux
系统
简单来说,
Linux
就是一个操作
系统
Linux
是一套免费使用和自由...
赞
踩
article
车
载
小
程序
快马加鞭
突围
车
联网
生态系统_凡泰极客
车
联网
...
在
车
企数字化的快
车
道上,汽
车
作为生活方式的延伸正在加速向前。每个人在
车
上度过的时间与注意力,已经慢慢成为一块让所有企业眼...
赞
踩
article
深度学习 | (7)
有
了
Transformer
框架后
是不是
RNN
完全可以废弃
了
?
_
请问现在
有
tra...
原文地址
有
了
Transformer
框架后
RNN
完全可以废弃,这个观点荒谬至极。举一个例子:除
了
个别探索,所
有
seq2se...
赞
踩
article
基于
pytorch
的
transformer
代码实现(包含
Batch
Normalization
,La...
基于
pytorch
的
transformer
代码实现2017年谷歌再nips上发表的《Attention Is All Y...
赞
踩
相关标签
科技
人工智能
chrome
vue.js
c++
神经网络
数据结构
散列表
开发语言
git
小程序
内容运营
经验分享
大模型
算法大赛
TOP
榜单
microsoft
安全
linux远程xdmp设置
linux
操作系统
移动开发
物联网