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

一、返回值

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

优点:

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

缺点:

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

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

优点:

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

缺点:

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

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

优点:

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

缺点:

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

(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聚合通多平台支付平台源码

Android 调用系统相册、系统相机拍照

Android 调用系统相册、系统相机拍照工具类 第一步(准备工作)&#xff1a;设置文件共享 1.1、指定 FileProvider 新建FileProvider类&#xff0c;名字随意&#xff0c;继承自FileProvider public class MainFileProvider extends FileProvider { }1.2 、清单中添加FileProv…

【小白专用 已验证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;复制&…

仲恺ZK——信计专业《软件体系结构》复习总结

前言 以下是我在总结的复习内容&#xff0c;有需要可以参考借鉴一下。我的主页还有另外一篇《2024年考试回忆》&#xff0c;两者结合起来复习&#xff0c;帮助你轻松过考试&#x1f60a;。总的来说&#xff0c;考试不会太难&#xff0c;只要你了解了各类设计模式的含义即可&am…

国家秘密的密级、保密期限和知悉范围变更的,应当及时( )通知知悉范围内的机关、单位或者人员。

国家秘密的密级、保密期限和知悉范围变更的&#xff0c;应当及时&#xff08; &#xff09;通知知悉范围内的机关、单位或者人员。详细答案查看 A. 口头B. 电话 C. 无须D. 书面 &#xff08; &#xff09;保密行政管理部门主管全国的保密工作。&#xff08; &#xff09;级以上…

第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…

简单工厂模式(大话设计模式)C/C++版本

简单工厂模式 C版本 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15926669.html #include <iostream> using namespace std; // 运算类 class Operation { private:double _NumA;double _NumB;public:void SetNumA(){cout << "Enter a double…

【动态规划】| 路径问题之最小路径和 力扣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;半导体、机器人、消费电子、光伏、虚拟电厂概念股…

Webrtc支持FFMPEG硬解码之解码实现(三)

前言 此系列文章分分为三篇, Webrtc支持FFMPEG硬解码之Intel(一)-CSDN博客 Webrtc支持FFMPEG硬解码之NVIDA(二)-CSDN博客 Webrtc支持FFMPEG硬解码之解码实现(三)-CSDN博客 AMD硬解目前还没找到可用解码器,欢迎留言交流 环境 Windows平台 VS2019 <

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

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

Docker面试整理-Docker容器与虚拟机比较,安全性如何?

Docker 容器与传统的虚拟机(VM)在许多方面都不同,其中之一是安全性。每种技术都有其特定的安全特点和潜在的风险。了解这些差异可以帮助你做出更好的决策,适当地使用它们来保障系统安全。 容器与虚拟机的安全性对比: 1. 隔离性: ● 虚拟机:提供较高的隔离性。每个虚拟机…

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;解压所有文件 例…

okHttp的https请求忽略ssl证书认证

使用okhttp请求第三方https接口返回异常 sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target意思就是非安全的调用&#…

我的高考往事

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

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

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