当前位置: 首页 > news >正文

【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.lryc.cn/news/140666.html

相关文章:

  • Git,分布式版本控制工具
  • LeetCode 面试题 02.02. 返回倒数第 k 个节点
  • SpeedBI数据可视化工具:丰富图表,提高报表易读性
  • 编写Dockerfile制作Web应用系统nginx镜像
  • 记录一次微服务连接Nacos异常-errorMsg: Illegal character in authority at index 7:
  • 【Java】反射 之 调用构造方法
  • Hightopo 使用心得(6)- 3D场景环境配置(天空球,雾化,辉光,景深)
  • 【Python PEP 笔记】201 - 同步迭代 / zip() 函数的使用方法
  • 远程控制:用了向日葵控控A2后,我买了BliKVM v4
  • 基于swing的火车站订票系统java jsp车票购票管理mysql源代码
  • MAVEN利器:一文带你了解IDEA中如何使用Maven
  • R语言15-R语言中的列的分裂与合并长宽数据转换
  • 使用Pytorch和OpenCV实现视频人脸替换
  • 【力扣】202. 快乐数 <哈希>
  • 深度学习4. 循环神经网络 – Recurrent Neural Network | RNN
  • 自动驾驶感知传感器标定安装说明
  • 基于JAYA算法优化的BP神经网络(预测应用) - 附代码
  • 基于单片机串口控制直流电机调速
  • Linux(基础篇一)
  • 小程序如何手动变更会员卡等级
  • Tensorflow2.0搭建网络八股
  • 【安装GPU版本pytorch,torch.cuda.is_available()仍然返回False问题】
  • Git 版本控制系统
  • 70吨服务区生活污水处理设备加工厂家电话
  • 十一、hadoop应用
  • Pytorch06-复杂模型构建
  • iPhone 15 Pro与谷歌Pixel 7 Pro:哪款相机手机更好?
  • react通过ref获取函数子组件实例方法
  • MathType7MAC中文版数学公式编辑器下载安装教程
  • python项目实战