搜索
查看
编辑修改
首页
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
gitlab 查看分支从那个分支拉取的_阿里云Kubernetes服务上搭建GitLab+Jenkins应用发布模型的实践...
2
protel DXP 2004_dxp2004sp2补丁
3
知乎上有个热门问题,Python 未来会成为大众办公常用编程工具吗?_知乎 python在日常办公中的应用多吗
4
2024年最全python基础(条件判断,input,循环,break,continue),面试提问的问题及答案
5
Elasticsearch-基础介绍及索引原理分析_elasticsearch索引原理
6
物联网python开发实践_python 物联网
7
在win10中编译chromium工程的稳定版本_chromium win7奔溃 win10不会
8
LeetCode热题100——矩阵
9
基于Spark的大规模推荐系统特征工程
10
手机空号检测API接口怎么对接_运营商手机号空号检测api接口快速对接
当前位置:
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
HAL
库_
STM32
与
陶晶驰
T1系列
串口
屏
通讯_
陶晶驰
串口
屏
链接
stm32
...
利用
陶晶驰
串口
屏
设计软件、Kei以及
STM32
CubeMX软件结合硬件,完成
串口
屏
与单片机之间的简单通信。_
陶晶驰
串口
屏
...
赞
踩
article
HTML5
调用
摄像头
录制
视频_
stoprecordcallback
...
HTML5
调用
摄像头
录制
视频不支持ie,ie下不支持webrtc,无法使用navigator.getUserMedia调...
赞
踩
article
在
Windows
中搭建
Stable
Diffusion
,目前最简单的
安装
方式,自己的专属 AI...
现在网络上有许多免费的
Stable
Diffusion
AI 图片生成工具,例如 Fast
Stable
Diffus...
赞
踩
article
Zookeeper
常见的面试题_
每个
server
在工作
过程
中有( )种
状态
...
Zookeeper
常见的面试题1. 什么是
Zookeeper
?谈谈你对
Zookeeper
的认识?
Zookeeper
是一个...
赞
踩
article
matlab
简介_
MATLAB
简介...
matlab
简介
MATLAB
简介 (
MATLAB
Introduction)
MATLAB
was designed ...
赞
踩
article
【云周刊】第143期:如何让
数据
价值
最大化
?阿里全域大
数据
系统
深度解读_
bridge
to
the
...
摘要: 如何让
数据
价值
最大化
?阿里全域大
数据
系统
深度解读,现代应用架构中的配置管理面临的挑战和应对之道,Bridge t...
赞
踩
article
F200
——搭载
基于
模型设计的国产
开源
飞控系统
无人机
_
f200
1km bug...
一、
F200
简介
F200
是目前
基于
FMT
开源
自驾仪项目开发的第一款
无人机
产品,旨在为广大
无人机
爱好者和科研工作者提供一个...
赞
踩
article
数据库
必备_
模式
,
内
模式
,
外
模式
...
转自:https://blog.csdn.net/u010963351/article/details/50836432...
赞
踩
article
【AI
大
模型
】在
测试
中
的
深度应用与实践案例_
aigi
大
模型
写
测试
用例
...
通过上述示例,我们展示了如何利用
大
模型
生成
测试
用例
、编写自动化
测试
脚本、进行性能
测试
和结果分析。在实际项目中,使用
大
模型
...
赞
踩
article
在
Linux
上
部署
Java
项目
过程...
在
Linux
上
部署
Java
项目
过程。在
Linux
上
部署
Java
项目
过程 ...
赞
踩
article
All
in
One | X-
AnyLabel
in
g
v2.0
.0 全自动
标注
工具
强势登场
,
全新
功能
...
X-AnyLalbe
in
g 中同样提供了丰富的快捷键
,
极大提升
标注
效率。大家可根据自己的习惯通过修改当前设备的用户根目录...
赞
踩
article
AWS
上(
Ubuntu
22.04)系统
配置
自己的AI大
模型
_
ubuntu
安装
本地阿里云ai大
模型
并...
本文将介绍在
AWS
上使用
Ubuntu
系统,使用开源工具Ollama部署LLaMa大
模型
,
安装
Docker以及使用Open...
赞
踩
article
在线
编辑涉密的
Word
文档,只读/
禁止
编辑/
禁止
复制/
禁止
另存/
禁止
打印_
在线
打开
word
...
在日常办公环境中,保密信息的安全性是至关重要的,我们经常会需要
在线
预览编辑涉密的
Word
文档,但是又要求这些涉密的文档只...
赞
踩
article
数据请求报400错误 参数不能解析_
accesskeyid
is
mandatory
for t...
ARN DefaultHandlerExceptionResolver:419 - Failed to read HTT...
赞
踩
article
linux
常用
命令
_
linnx
中
在vi编辑器
的
命令
状态
下,将文件
中
的
所有字符
a
修改为
a
...
1)
linux
命令
:2) ctrl + c 终止当前
命令
,
linux
严格区分大小写3) 每个终端有个shell,不同
的
...
赞
踩
article
必备知识:
解决
matlab
启动慢的问题
,
亲测有效
,
matlab
2019b8秒
打开
_
matlab
202...
前几天
打开
matlab
2018
,
突然就不行了
,
一直在初始化
,
无奈
,
之前是因为新版本实在太大了
,
好几十个g一直懒得下
,
正好...
赞
踩
article
PyQt5
笔记8 --
鼠标
、
键盘
事件
_
backtabfocusreason
...
PyQt5
笔记8 –
鼠标
、
键盘
事件
参考博客(
鼠标
事件
)参考博客(
键盘
事件
)1、
鼠标
事件
事件
:mousePressEv...
赞
踩
article
Pytorch
-
Transformer
轴承故障一维
信号
分类(三)_
pytorch
使用transfor...
Pytorch
实现Transforme模型对故障
信号
的分类_
pytorch
使用
transformer
对一维
信号
pytor...
赞
踩
article
Git
的
安装
和
使用
_
git
安装
并
使用
...
目录一、
Git
的下载和
安装
1.
git
的下载2.
安装
二、
Git
的基本
使用
-操作本地仓库1 初始化仓库1)创建一个...
赞
踩
article
python
利用向量
数据库
chroma
实现
RAG
检索增强
生成
_
chroma
rag
...
向量
数据库
chroma
教程
RAG
的全称是,中文翻译为检索增强
生成
。它是一个为大模型提供外部知识源的概念,这使它们能够
生成
...
赞
踩
相关标签
stm32
嵌入式硬件
单片机
前端
windows
stable diffusion
人工智能
tcp/ip
服务器
音视频
网络
zookeeper
分布式
java
编程语言
python
大数据
阿木实验室
数据库必备
开发语言
ai
linux
运维
计算机视觉