返回值返回引用返回指针之间的区别

一、返回值

当函数返回一个值时,实际返回的是一个变量的拷贝。

优点:

  • 简单易用;
  • 安全,不会导致悬挂指针或悬挂引用;

缺点:

  • 当返回值是一个较大的对象时会产生拷贝开销,影响程序性能;
二、返回引用

当函数返回一个引用时,实际返回的是变量的别名。

优点:

  • 没有拷贝开销,不影响程序性能;
  • 可以用于返回对象本身,实现链式调用;

缺点:

  • 如果是局部变量的引用,会导致未定义行为(悬挂引用);
三、返回指针

当函数返回一个指针时,实际返回的是一个变量的地址。

优点:

  • 灵活性高
  • 可用于动态分配内存的返回;

缺点:

  • 不安全,可能产生内存泄漏;
  • 可能导致悬挂指针(返回了一个已经释放的内存);
四、总结

(1)适用场景

  • 返回值:适用于基本数据类型或小对象 ,不需要考虑性能问题。或需要使用临时对象的场景。
  • 返回引用:适用于较大的对象 ,需要考虑性能问题的场景。
  • 返回指针:适用于动态分配内存或指针灵活指向的场景。

(2)注意事项

  • 返回局部对象或局部变量时:局部变量和局部对象在使用后会被销毁 ,返回它们的引用会产生悬挂引用或悬挂指针。使用这些引用会产生未定义行为。
  • 内存管理: 对于函数内部手动分配的内存 ,在适当的时候需要进行销毁 ,以避免内存泄漏。不能返回指向已经被销毁的内存空间的指针。 如果函数返回一个指向动态分配内存的指针,在使用结束后必须手动销毁这段内存,以避免内存泄漏。
五、代码实例
#include <iostream>
#include <stdexcept>
#include <string>using namespace std;class Person
{
public:Person() {} // 默认构造Person(std::string name, int age, std::string sex) :name(name), age(age), sex(sex) {}   // 带参构造Person(const Person& p){this->name = p.name;this->age = p.age;this->sex = p.sex;std::cout << std::endl << "对象拷贝" << std::endl;}friend std::ostream& operator<<(std::ostream& os, const Person& p);private:std::string name;int age;std::string sex;
};std::ostream& operator<<(std::ostream& os,const Person& p)
{os << "姓名: " << p.name << std::endl << "年龄: " << p.age << std::endl << "性别: " << p.sex << std::endl;return os;
}// 返回值
int getInt()    
{int x = 10;return x;
}// 返回引用
int& getIntReference(int &x)  
{return x;   // 返回 x 的引用
}// 返回指针
int* getIntPointer(int* x)  
{if (x == nullptr) {throw std::invalid_argument("不能返回一个空指针");}return x;   // 返回 x 的地址
}/* 
* 返回局部对象的引用
*/
Person& getLocalIntReference()
{// 不允许返回局部对象的引用,抛出异常throw std::runtime_error("不允许返回局部对象的引用");
}/*
* 返回局部指针
*/
int* getLocalIntPointer()
{int arr[4] = { 1,2,3,4 };// 不允许返回局部指针,抛出异常throw std::runtime_error("不允许返回局部指针");
}/*
* 返回动态分配的内存
*/
int* getMotionIntPointer()
{int* x = new int(10);if (x == nullptr) {throw std::runtime_error("不能返回一个空指针");}return x;
}int main()
{try {std::cout << "返回值: " << getInt() << std::endl;int temp = getInt();std::cout << "返回引用: " << getIntReference(temp) << std::endl;int temp2 = getInt();std::cout << "返回指针: " << getIntPointer(&temp2) << std::endl;std::cout << "返回局部引用: " << getLocalIntReference() << std::endl;  // 会抛出异常} catch (const std::exception& e) {std::cerr << "捕获的异常: " << e.what() << std::endl;}try {std::cout << "返回局部指针: " << getLocalIntPointer() << std::endl;  // 会抛出异常} catch (const std::exception& e) {std::cerr << "捕获的异常: " << e.what() << std::endl;}try {int* ptr = getMotionIntPointer();std::cout << "返回动态内存: " << *ptr << std::endl;delete ptr;  // 确保释放动态分配的内存} catch (const std::exception& e) {std::cerr << "捕获的异常: " << e.what() << std::endl;}return 0;
}
六、运行结果

在这里插入图片描述

文章部分内容使用了ChatGPT,如有谬误,请各位大佬留言指正!

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

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

相关文章

PHP聚合通多平台支付平台源码

源码介绍 php聚合通多平台支付平台源码&#xff0c;源码搭建了一下&#xff0c;这个源码不复杂&#xff0c;修改一下数据库账号密码然后导入数据库就可以&#xff0c;和网站恢复备份一样简单&#xff01; 源码截图 源码下载 PHP聚合通多平台支付平台源码

【小白专用 已验证24.6.7】C# MySQL数据库访问操作封装类

一、底层库介绍 本文主要介绍数据库访问操作类&#xff0c;包含&#xff1a;SQL插入脚本、SQL查询脚本、数据库表是否存在判断、带参脚本执行、包含事务回滚脚本执行、存储过程脚本等等。 特殊说明 在使用之前&#xff0c;先安装 MySql.Data 插件 二、底层库源码 2.1 程序源…

C++ 24 之 拷贝构造函数

c24拷贝构造函数.cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Person3 { private:int p_age; public:// 构造函数分类&#xff1a;// 按参数分类&#xff1a;1、有参 2、无参// 按类型分类:普通、拷贝&#xff08;复制&…

第2章 Rust初体验5/8:match表达式和模式匹配:更富表达力:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.5 故事3: 比较答案与点数之和 贾克强:“同学们,我们开始用三种语言来实现故事3吧!” 2.5.1 Rust版故事3 这个故事实在是轻松容易地实现了。赵可菲照着书,一下子就写好了。 @@ -1,4 +1,5 @@use rand::Rng; +use std::cmp::Ordering;use std…

【动态规划】| 路径问题之最小路径和 力扣64

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/minimum-path-sum/description/ 这道题目和之前一道…

使用CSS、JavaScript、jQuery三种方式实现手风琴效果

手风琴效果有不少&#xff0c;王者荣耀官网&#xff08;源网址 https://pvp.qq.com/raiders/ &#xff09;有一处周免英雄&#xff0c;使用的就是手风琴效果&#xff0c;如图所示。 我试着用css、js、jQuery三种方式实现了这种效果&#xff0c;最终效果差不多&#xff0c;美中不…

周四 A股震荡走低,行情总结

文章正文 周四&#xff0c;A股全日震荡走低&#xff0c;上证指数收跌0.28%&#xff0c;深成指跌近0.创业板指跌0.09%。猪肉、有色金属、中药、磷化工、煤炭、房地产、白酒行业跌幅靠前。科特估概念股掀起20cm涨停潮&#xff0c;半导体、机器人、消费电子、光伏、虚拟电厂概念股…

问题:以下描写乡村词语的是() #媒体#媒体#知识分享

问题&#xff1a;以下描写乡村词语的是&#xff08;&#xff09; A&#xff0e;高楼林立 B&#xff0e;车水马龙 C&#xff0e;依山傍水 参考答案如图所示

ThinkPHP+Bootstrap简约自适应网址导航网站源码

使用 ThinkPHPbootstrap 开发&#xff0c;后台采用全局 ajax 无刷新加载&#xff0c;前后台自适应&#xff0c;前台页面非常简洁适合自己收藏网站或做导航网站。 搭建教程&#xff1a; 1.整个主机 2.绑定解析域名 3.上传源码&#xff0c;解压 把解压出来的 nav.sql 文件导入数…

STM32自己从零开始实操05:接口电路原理图

一、TTL 转 USB 驱动电路设计 1.1指路 延续使用芯片 CH340E 。 实物图 原理图与封装图 1.2数据手册重要信息提炼 1.2.1概述 CH340 是一个 USB 总线的转接芯片&#xff0c;实现 USB 与串口之间的相互转化。 1.2.2特点 支持常用的 MODEM 联络信号 RTS&#xff08;请求发送&…

ubuntu下使用cmake编译opencv4.8.0+ffmpeg4.2.2+cuda11.1

1.源码下载 &#xff08;1&#xff09;下载ffmpeg4.2.2、opencv4.8.0源码&#xff0c;这里提供一个百度网盘地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pBksr0_RtKL0cM6Gsf2MGA?pwdcyai 提取码&#xff1a;cyai &#xff08;2&#xff09;解压所有文件 例…

我的高考往事

高考对于每一个参加过的人来说&#xff0c;都是一段非常难忘的回忆。 我参加高考&#xff0c;是在2001年。虽然迄今已经过去了23年&#xff0c;但很多细节仍然记忆犹新。 今天这篇文章&#xff0c;我就和大家分享一下&#xff0c;我的高考往事。 █ 青少年时代 我的老家是在江西…

开个技术外挂 | 数字孪生技术如何成为美洲杯帆船赛成功的关键?

若您对数据分析以及人工智能感兴趣&#xff0c;欢迎与我们一起站在全球视野关注人工智能的发展&#xff0c;与Forrester 、德勤、麦肯锡等全球知名企业共探AI如何加速工业变革&#xff0c;共享众多优秀行业案例&#xff0c;开启AI人工智能全球新视野&#xff01;&#xff01; …

Ubuntu Server 20.04挂载磁盘

先查看磁盘信息&#xff1a; sudo fdisk -l然后提供NTFS文件系统支持&#xff1a; sudo mkfs.ntfs /dec/sda -F这个过程非常久… 处理完如上图。&#xff08;ps. 这个 Have a nice day. 好浪漫~&#xff09; 接着挂载磁盘&#xff1a; sudo mount /dev/sda ~/device设置开机…

计算机网络(4) 最长前缀匹配(路由转发表)

一.路由转发 网络数据包IP段只包含源地址与目的地址&#xff0c;经过数据链路层包装与物理层信号形式转换&#xff0c;最终经由不同的链路节点到达目的地址。这个过程是一步一步&#xff08;hop by hop&#xff09;进行的&#xff0c;路过一个路由节点则称为一跳。每个路由节点…

会声会影2023软件:安装包下载 丨不限速下载丨亲测好用

会声会影(Corel VideoStudio)为加拿大Corel公司发布的一款功能丰富的视频编辑软件。 会声会影2023简单易用&#xff0c;具有史无前例的强大功能&#xff0c;拖放式标题、转场、覆叠和滤镜&#xff0c;色彩分级、动态分屏视频和新增强的遮罩创建器&#xff0c;超越基本编辑&…

JavaScript的函数(几种函数的定义和使用)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

实时数据的处理一致性如何保证?

实时数据一致性的定义以及面临的挑战 数据一致性通常指的是数据在整个系统或多个系统中保持准确、可靠和同步的状态。在实时数据处理中&#xff0c;一致性包括但不限于数据的准确性、完整性、时效性和顺序性。 下图是典型的实时/流式数据处理的流程&#xff1a; 流式数据以各…

搜索二叉树的概念及实现

搜索二叉树的概念 搜索二叉树规则&#xff08;左小右大&#xff09;&#xff1a; 非空左子树的键值小于其根节点的键值非空右子树的键值大于其根节点的键值左右子树均为搜索二叉树 如图&#xff1a; 在搜索时&#xff0c;若大于根&#xff0c;则去右子树寻找&#xff1b;若小…

Python:基础爬虫

Python爬虫学习&#xff08;网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字…