4. 返回 const 对象

// 1: three Vector objects

// 2: dyslectic programming

String s2, $3;
s3 = s2 = sl;
在上述代码中,s2.operator=(s2)的返回值被赋给s3。为此,返回String对象或String对象的引用都是
可行的,但与Vector范例中一样,通过使用引用,可避免该函数调用String的复制构造函数来创建一个新
的String对象。在这个例子中,返回类型不是const,因为方法operator=()返回一个指向s2的引用,可以
对其进行修改。
Operator << ()的返回值用于串接输出:
String s1("Good stuff");
cout << s1 << "is coming!";
在上述代码中,operator << (cout,s1)的返回值成为一个用于显示字符串“is coming!”的对象。返回类型
必须是ostream&,而不能仅仅是ostream。如果使用返回类型ostream,将要求调用 ostream类的复制构造
函数,而ostream没有公有的复制构造函数。幸运的是,返回一个指向cout的引用不会带来任何问题,因
为cout已经在调用函数的作用域内。

3. 返回对象
如果被返回的对象是被调用函数中的局部变量,则不应按引用方式返回它,因为在被调用函数执行完
毕时,局部对象将调用其析构函数。因此,当控制权回到调用函数时,引用指向的对象将不再存在。在这
种情况下,应返回对象而不是引用。通常,被重载的算术操作符属于这一类。请看下述范例,它再次使用
了 Vector类:
Vector forcel (50,60);
Vector force2 (10, 70) ;
Vector net;
net = forcel + force2;
被返回的不是force1,也不是force2,forcel和force2在这个过程中应该保持不变。因此,返回值不能
是指向在调用函数中已经存在的对象的引用。相反,在Vector :: operator+()中计算得到的两个矢量的和被存
储在-个新的临时对象中,该函数也不应返回一个指向该临时对象的引用,而应该返回实际的Vector对象,
而不是引用:
Vector Vector :: operator+(const Vector & b) const

return Vector (x + b.x, y + b.y);

在这种情况下,存在调用复制构造函数来创建被返回的对象的开销,然而这是无法避免的。
在上述范例中,构造函数调用 Vector(x+b.x,y+b.y)创建一个方法 operator+()能够访问的对象;而返
回语句引发的对复制构造函数的隐式调用创建一个调用程序能够访问的对象。

4. 返回 const 对象
前面的 Vector :: operator+()定义有一个奇异的属性,它旨在让您以下面这样的方式使用它:
net = forcel + force2;
然而,这种定义也允许您这样使用它:
forcel + force2 = net;
cout << (forcel + force2 = net).magval() << endl; // 3: demented programming
这提出了三个问题。为何编写这样的语句?这些语句为何可行?这些语句有何功能?
首先,没有要编写这种语句的合理理由,但并非所有代码都是合理的。即使是程序员也会犯错。例如,
为 Vector类定义operator == ()时,您可能错误地输入这样的代码:
if (forcel + force2 = net)
而不是:
if (forcel + force2 == net)
另外,程序员通常很有创意,这可能导致错误。
其次,这种代码之所以可行,是因为复制构造函数将创建一个临时对象来表示返回值。因此,在前面
的代码中,表达式force1+force2的结果为一个临时对象。在语句1中,该临时对象被赋给net;在语句2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【KingbaseES】实现MySql函数Space

CREATE OR REPLACE FUNCTION SPACE(input_length integer) RETURNS text AS $$ BEGIN RETURN REPEAT( , input_length) AS SPACES; END; $$ LANGUAGE plpgsql;

深度学习课程实验二深层神经网络搭建及优化

一、 实验目的 1、学会训练和搭建深层神经网络&#xff1b; 2、掌握超参数调试正则化及优化。 二、 实验步骤 初始化 1、导入所需要的库 2、搭建神经网络模型 3、零初始化 4、随机初始化 5、He初始化 6、总结三种不同类型的初始化 正则化 1、导入所需要的库 2、使用非正则化…

实验笔记之——基于Linux服务器复现Instant-NGP及常用的tmux指令

之前博客实现了基于windows来复现Instant-NGP&#xff0c;本博文在linux服务器上测试 实验笔记之——基于windows复现Instant-NGP-CSDN博客文章浏览阅读444次&#xff0c;点赞15次&#xff0c;收藏7次。之前博客对NeRF-SLAM进行了调研&#xff0c;本博文先复现一下Intant-NGP。…

C++基础语法——基本知识、数据类型、运算符及程序流程结构

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; >第1阶段-C基础入门 ---------第2阶段实战-通讯…

Java基础进阶(学习笔记)

注&#xff1a;本篇的代码和PPT图片来源于黑马程序员&#xff0c;本篇仅为学习笔记 static static 是静态的意思&#xff0c;可以修饰成员变量&#xff0c;也可以修饰成员方法 修饰成员的特点&#xff1a; 被其修饰的成员, 被该类的所有对象所共享 多了一种调用方式, 可以通过…

OpenHarmony源码转换器—多线程特性转换

本文讨论了如何将多线程的 Java 代码转换为 OpenHarmony ArkTS 代码​ 一、简介 Java 内存共享模型 以下示例伪代码和示意图展示了如何使用内存共享模型解决生产者消费者问题。 生产者消费者与共享内存间交互示意图 为了避免不同生产者或消费者同时访问一块共享内存的容器时…

算法训练营第三十五天|860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

目录 Leetcode860.柠檬水找零Leetcode406.根据身高重建队列Leetcode452. 用最少数量的箭引爆气球 Leetcode860.柠檬水找零 文章链接 &#xff1a;代码随想录 题目链接&#xff1a;860.柠檬水找零 class Solution { public:bool lemonadeChange(vector<int>& bills) {…

数字信号处理期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

drf知识--11

补充 # 研究simple-jwt提供的Token类&#xff1a; 1、RefreshToken:生成refresh token的类 2、AccessToken:生成refresh token的类 3、Token&#xff1a;他们俩的父类 4、str(RefreshToken的对象)---得到字符串 refresh token&#xff0c;Token类写了 …

IO作业4.0

思维导图 创建出三个进程完成两个文件之间拷贝工作&#xff0c;子进程1拷贝前一半内容&#xff0c;子进程2拷贝后一半内容&#xff0c;父进程回收子进程的资源 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h> int …

win2003搭建DNS服务器域名解析方法

可以搭建DNS服务器的系统有很多&#xff0c;这里以win2003举例。 要在Windows 2003上搭建DNS服务器&#xff0c;需要按照以下步骤操作&#xff1a; 一 配置DNS服务器 1、打开“控制面板”,选择“添加/删除程序”,点击“添加/删除Windows组件”。 2、在“Windows组件向导”中…

批量AI智剪方法:轻松学会视频剪辑,让你的视频更精彩

在数字媒体时代&#xff0c;视频剪辑已经成为一项重要的技能。对于许多初学者来说&#xff0c;视频剪辑可能是一项复杂且耗时的任务。那么如何解决这个问题呢&#xff1f;现在一起来看看云炫AI智剪如何批量剪辑的方法&#xff0c;轻松完成视频剪辑工作&#xff0c;让视频更加精…

通往人工智能的 Go 之路

Agency 该库旨在为那些希望通过清晰、高效且符合 Go 语言惯例的方法来探索大型语言模型&#xff08;LLMs&#xff09;和其他生成式人工智能的开发人员而设计。 特点 纯 Go 语言&#xff1a;快速、轻量级&#xff0c;静态类型&#xff0c;无需涉及 Python 或 JavaScript编写清晰…

【科研指南8】如何快速批量下载一篇论文后的所有的参考文献?附赠Endnote分组论文管理

如何快速下载一篇论文后的所有的参考文献&#xff1f; 写在最前面第一步&#xff1a;在文献检索网站导出引用文献的RIS文件第二步&#xff1a;EndNote导入RIS文件&#xff0c;然后批量下载第三步&#xff08;可选&#xff09;&#xff1a;将之前找到的论文合并到Endnote一个数据…

MySQL JSON_CONTAINS() 传递参数

一、JSON_CONTAINS 用法 MySQL JSON_CONTAINS() 函数检查一个 JSON 文档中是否包含另一个 JSON 文档。 语法 JSON_CONTAINS(target_json, candidate_json) JSON_CONTAINS(target_json, candidate_json, path)参数 target_json&#xff1a;必需的。一个 JSON 文档。candida…

node常见概念

node常见概念 非阻塞&异步 node的用处 模块化 文件是互不干扰的 文件之间能相互调用 只有函数才会产生作用域。 join和resolve的区别&#xff1a; join&#xff1a;拼接 resolve&#xff1a;解析 require是同步的 把文件读成一个字符串&#xff0c;包装成一个自执行函数&am…

FLatten Transformer:聚焦式线性注意力模块

线性注意力将Softmax解耦为两个独立的函数&#xff0c;从而能够将注意力的计算顺序从(querykey)value调整为query(keyvalue)&#xff0c;使得总体的计算复杂度降低为线性。然而&#xff0c;目前的线性注意力方法要么性能明显不如Softmax注意力&#xff0c;并且可能涉及映射函数…

2024数字阅读有望进一步推动全民阅读多元化

数字化技术发展为阅读提供了更多选择方式,不仅使阅读打破了时空限制,也让阅读有了更为丰富的体验。 1月1日,以“点亮阅读,温暖寒冬”为主题的书香市集活动在北京王府井步行街启幕。此次活动联动中国书店、北京市新华书店等7家书店和大型书城,通过图书售卖、展览展示等一系列活…

CISSP 第6章: 密码学与对称加密算法

第六章 密码学与对称加密算法 6.1 密码学历史上的里程碑 6.1.1 凯撒密码 简单的将字母表中的每个字母替换成其后的三个字母&#xff0c;是单一字母的替代置换密码 6.1.2 美国内战 美国内战使用词汇替代和置换的复杂组合&#xff0c;从而试图破坏敌人的破译企图 6.1.3 Ultra与…

【Git】Git版本控制工具使用详解

1、版本控制 特点 协同修改: 多人可以并行修改服务器端的同一个文件 数据备份: 不仅保存目录和文件的当前状态,还可以保存每一个提交过的文件的历史状态 2、版本管理: 在保存每一个版本的文件信息时要做到不保存重复数据以节约存储空间 提高运行效率 SVN采用增量式更新 Git采用…