【C++】C++ 引用详解 ⑤ ( 函数 “ 引用类型返回值 “ 当左值被赋值 )

文章目录

  • 一、函数返回值不能是 " 局部变量 " 的引用或指针
    • 1、函数返回值常用用法
    • 2、分析函数 " 普通返回值 " 做左值的情况
    • 3、分析函数 " 引用返回值 " 做左值的情况


函数返回值 能作为 左值 , 是很重要的概念 , 这是实现 " 链式编程 " 的基础 ;





一、函数返回值不能是 " 局部变量 " 的引用或指针




1、函数返回值常用用法


在 C++ 语言中 , 函数返回值 一般不会直接作为左值 , 因为 函数返回值是一个临时对象 , 一般情况下 都是当做右值使用 , 函数 返回的值都是 其 函数内部 局部变量 的 副本 , 这些 副本 不能作为左值参与赋值操作 ;

如果 是 外部通过 函数参数 传入到函数中的 指针 / 引用 , 没有必要返回 , 外部已经有了 , 你再返回一次意义不大 ;


2、分析函数 " 普通返回值 " 做左值的情况


函数普通返回值 不能做左值 ;


如果函数返回值是一个普通类型 , 那么返回的是 指定变量 的副本值 ;

下面的 fun 函数中 , 返回的是 静态变量 a 的值 ,

注意 : 这里返回的只是 a 的值 , 与静态变量无关 ;

是将 静态变量 a 复制一份 , 将复制后的 副本 10 这个数值返回了 ;

// 返回静态变量的值
int fun()
{static int a = 10;return a;
}

下面 的代码中 , 强行给 函数 返回的 普通变量 的 副本值 进行复制 , 报

error C2106:=: 左操作数必须为左值

错误信息 ;


错误代码示例 :

// 导入标准 io 流头文件
// 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;#include <stdio.h>// 返回静态变量的值
int fun()
{static int a = 10;return a;
}// 返回静态变量引用 , 也就是静态变量自身
int& fun2()
{static int a = 20;return a;
}int main() {fun() = 100;return 0;
}

编译运行报错信息 :

1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Hello.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(25,16): error C2106:=: 左操作数必须为左值
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

在这里插入图片描述


3、分析函数 " 引用返回值 " 做左值的情况


函数引用返回值 可以做左值 ;


下面的 fun2 函数 , 返回 局部变量 中 创建的 静态变量 a 的引用 ,

相当于 将 静态变量 的 内存地址返回回去了 ,

该 静态变量的 内存地址 直到程序结束之前 都是有效的 , 因此该引用返回值 可以正常使用 ;

该 函数返回值 可以作为 正常的变量使用 , 既可以作为左值使用 , 又可以作为右值使用 ;

// 返回静态变量引用 , 也就是静态变量自身
int& fun2()
{static int a = 20;return a;
}

在下面的代码中 , 先获取 fun2 函数的 引用返回值 , 将其打印出来 , 值为 10 ;

然后 再次调用 fun2 函数 , 直接将其作为左值 , 为其 赋值 100 , 然后打印 之前获取的 引用值 , 值也变为 100 ;

函数的引用返回值 可以作为 左值使用 ;


函数返回值 做 左值 代码示例 :

// 导入标准 io 流头文件
// 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;#include <stdio.h>// 返回静态变量的值
int fun()
{static int a = 10;return a;
}// 返回静态变量引用 , 也就是静态变量自身
int& fun2()
{static int a = 20;return a;
}int main() {// 先获取 fun2 函数返回的引用int& a = fun2();// 打印 引用 初始值printf("a = %d\n", a);// 引用类型返回值 fun2() = 100;// 打印修改后的效果printf("a = %d\n", a);return 0;
}

执行结果 :

a = 20
a = 100Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 17252)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

在这里插入图片描述

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

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

相关文章

淘宝API技术解析,实现关键词搜索淘宝商品(商品详情接口等)

淘宝提供了开放平台接口&#xff08;API&#xff09;来实现按图搜索淘宝商品的功能。您可以通过以下步骤来实现&#xff1a; 获取开放平台的访问权限&#xff1a;首先&#xff0c;您需要在淘宝开放平台创建一个应用&#xff0c;获取访问淘宝API的权限。具体的申请步骤和要求可以…

LabVIEW开发灭火器机器人

LabVIEW开发灭火器机器人 如今&#xff0c;自主机器人在行业中有着巨大的需求。这是因为它们根据不同情况的适应性。由于消防员很难进入高风险区域&#xff0c;自主机器人出现了。该机器人具有自行检测火灾的能力&#xff0c;并通过自己的决定穿越路径。 由于消防安全是主要问…

java八股文面试[java基础]——如何实现不可变的类

知识来源&#xff1a; 【23版面试突击】如何实现不可变的类&#xff1f;_哔哩哔哩_bilibili 【2023年面试】怎样声明一个类不会被继承&#xff0c;什么场景下会用_哔哩哔哩_bilibili

JVM 之字节码(.class)文件

本文中的内容参考B站尚硅谷宋红康JVM全套教程 你将获得&#xff1a; 1、掌握字节码文件的结构 2、掌握Java源代码如何在JVM中执行 3、掌握一些虚拟机指令 4、回答一些面试题 课程介绍 通过几个面试题初始字节码文件为什么学习class字节码文件什么是class字节码文件分析c…

2022年03月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;拦截导弹 某国为了防御敌国的导弹袭击&#xff0c; 发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a; 虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c; 雷达捕捉到敌国的…

Vue3.0极速入门- 目录和文件说明

目录结构 以下文件均为npm create helloworld自动生成的文件目录结构 目录截图 目录说明 目录/文件说明node_modulesnpm 加载的项目依赖模块src这里是我们要开发的目录&#xff0c;基本上要做的事情都在这个目录里assets放置一些图片&#xff0c;如logo等。componentsvue组件…

SFM structure from motion

struction就是空间三维点的位置 motion 就是相机每帧的位移 https://www.youtube.com/watch?vUhkb8Zq-dnM&listPL2zRqk16wsdoYzrWStffqBAoUY8XdvatV&index9

西部AI小镇-构建自主虚拟世界

背景 未来曜文有接入市场上所有面向chatGPT开发的应用&#xff0c;例如开源聊天组件&#xff0c;西部小镇等 内容介绍 生成代理起床&#xff0c;做早餐&#xff0c;然后去上班&#xff1b;艺术家作画&#xff0c;作家写作&#xff1b;他们形成意见、互相关注并发起对话&…

Linux线程 --- 生产者消费者模型(C语言)

在学习完线程相关的概念之后&#xff0c;本节来认识一下Linux多线程相关的一个重要模型----“ 生产者消费者模型” 本文参考&#xff1a; Linux多线程生产者与消费者_红娃子的博客-CSDN博客 Linux多线程——生产者消费者模型_linux多线程生产者与消费者_两片空白的博客-CSDN博客…

基于Java+SpringBoot+Vue前后端分离党员教育和管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

ServiceManager接收APP的跨进程Binder通信流程分析

现在一起来分析Server端接收&#xff08;来自APP端&#xff09;Binder数据的整个过程&#xff0c;还是以ServiceManager这个Server为例进行分析,这是一个至下而上的分析过程。 在分析之前先思考ServiceManager是什么&#xff1f;它其实是一个独立的进程&#xff0c;由init解析i…

银河麒麟服务器、centos7服务器一键卸载mysql脚本

脚本 # 查看mysql相关的rpm包写到rmsql.sh文件中 rpm -aq | grep -i mysql >rmsql.sh # 修改文件为卸载mysql的脚本文件 sed -i -e s/^/yum remove -y / rmsql.sh # 修改文本权限 chmod 777 rmsql.sh # 全盘查找mysql相关文件&#xff0c;写到my.sh脚本中 find / -name mysq…

git及GitHub的使用

文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐&#xff0c;现在用起来比较麻烦)ssh连接&#xff08;推荐&#xff09;git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注&#xff1a; 下载完…

框架(Git基础详解及Git在idea中集成步骤)

目录 基础&#xff1a; idea集成Git并添加项目到git仓库 1.idea集成git&#xff0c;集成.git.exe文件 2.初始化本地Git仓库项目 3. 将工作区代码添加到暂存区 4.将暂存区代码添加到本地仓库 5.Git本地库操作 Idea集成Gitee并提交代码到第三方库 1.setting里搜索gitee 2.添…

ASEMI快恢复二极管APT80DQ60BG特点应用

编辑-Z APT80DQ60BG参数描述&#xff1a; 型号&#xff1a;APT80DQ60BG 最大峰值反向电压(VRRM)&#xff1a;600V 最大直流阻断电压VR(DC)&#xff1a;600V 平均整流正向电流(IF)&#xff1a;80A 非重复峰值浪涌电流(IFSM)&#xff1a;600A 工作接点温度和储存温度(TJ, …

设计模式(11)观察者模式

一、概述&#xff1a; 1、定义&#xff1a;观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象&#xff0c;使它们能够自动更新自己。 2、结构图&#xff1a; public interface S…

(三)行为模式:4、迭代器模式(Iterator Pattern)(C++示例)

目录 1、迭代器模式&#xff08;Iterator Pattern&#xff09;含义 2、迭代器模式的UML图学习 3、迭代器模式的应用场景 4、迭代器模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现迭代器模式的实例 1、迭代器模式&#xff08;Itera…

java学习-阻塞队列原理

JAVA 阻塞队列原理 阻塞队列&#xff0c;关键字是阻塞&#xff0c;先理解阻塞的含义&#xff0c;在阻塞队列中&#xff0c;线程阻塞有这样的两种情况&#xff1a; 当队列中没有数据的情况下&#xff0c;消费者端的所有线程都会被自动阻塞&#xff08;挂起&#xff09;&#x…

【谷粒学院】开发篇二:后台管理系统搭建逆向生成代码

后台管理系统介绍 本篇文章主要内容如下&#xff1a; 1.使用人人开源人人开源绞手架搭建后台管理系统的前端和后端框架。 2.使用renren-generator逆向生成微服务&#xff08;gulimall_pms、gulimall_oms、gulimall_sms、gulimall_ums、gulimall_wms&#xff09;的CRUD代码。 …

探索图结构:从基础到算法应用

文章目录 理解图的基本概念学习图的遍历算法学习最短路径算法案例分析&#xff1a;使用 Dijkstra 算法找出最短路径结论 &#x1f389;欢迎来到数据结构学习专栏~探索图结构&#xff1a;从基础到算法应用 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;I…