news 2026/5/1 10:22:35

值返回与引用返回(c++)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
值返回与引用返回(c++)

目录

值返回

引用返回

二者的区别

生命周期

可以安全引用返回的情况

返回函数参数(传入的引用)

返回成员变量

返回动态分配的对象(但通常是返回指针)

禁止返回的类型

返回局部变量

返回临时对象

返回局部指针指向的对象

复制代码试一下

总结


在c++中函数可以返回值(by value)也可以返回引用(by reference)。

两者的根本区别在于返回的是对象的副本还是对象本身

值返回

返回对象的副本,调用者得到的是全新的独立对象

// 值返回:返回类型不带& string function1() { // 返回string(值) string local = "hello would"; return local; // 返回local的副本 }

引用返回

返回对象的引用(别名),调用者得到的是已有对象的另一个名称,不创建新对象。

// 引用返回:返回类型带& string& function2() { // 返回string&(引用) static string global = "world"; return global; // 返回global的引用(别名) } // const引用返回 const string& function3() { // 返回const string&(常量引用) static string global = "world"; return global; // 返回不能修改的引用 }

二者的区别

最主要的判断方式是其函数类型后是否跟着& 若其跟着&即为返回对象的引用 不创建新的对象

生命周期

值返回例子如下

string version1(const string& s1, const string& s2) { string temp;//创建局部变量temp(在栈上) temp = s2 + s1 + s2;//计算s2+s1+s2,赋值给temp return temp;//创建temp的副本(临时对象)作为返回值 } //函数结束:temp被销毁(栈帧弹出) //主函数中:用返回值初始化或赋值给result(调用拷贝构造函数或赋值运算符)

即可以得出version1返回的是值 并且在返回后temp被销毁 而其return的是temp的副本与temp本身的销毁无关 完全的独立

引用返回

version3 当函数结束后,temp就被销毁了,所以返回的引用将指向一个不再存在的对象,这会导致未定义行为。注意:不要返回局部变量的引用或指针

可以安全引用返回的情况

返回静态局部变量

const string& getDefaultName() { static string defaultName = "Default"; // 静态变量 return defaultName; // 安全:生命周期为整个程序不会随着函数结束而销毁 }

返回函数参数(传入的引用)

​ string& appendStars(string& str) { str += "***"; return str; // 安全:str的生命周期由调用者管理 }

返回成员变量

class Person { private: string name; public: const string& getName() const { return name; } // 安全 string& getName() { return name; } // 安全(但有风险) };

返回动态分配的对象(但通常是返回指针)

string* createDynamicString() { return new string("Dynamic"); // 返回指针,调用者需delete }

禁止返回的类型

返回局部变量

const string& badFunction() { string local = "Local"; // 局部变量 return local; // 致命错误!返回后将指向无效内存 }

返回临时对象

const string& badFunction2() { return string("Temporary"); // 临时对象,语句结束就销毁 }

返回局部指针指向的对象

string& badFunction3() { string* ptr = new string("Dynamic"); return *ptr; // 危险:内存泄漏风险,调用者不知道需要delete }

总结 注意:不要返回局部变量的引用或指针

复制代码试一下

//strquote.cpp -- different designs #include<iostream> #include<string> using namespace std; string version1(const string& s1, const string& s2); const string& version2(string& s1, const string& s2); //has side effect const string& version3(string& s1, const string& s2); //bad design int main() { string input; string copy; string result; cout << "Enter a string: "; getline(cin, input); copy = input; cout << "Your string as entered: " << input << endl; result = version1(input, "***"); cout << "Your string enhanced: " << result << endl; cout << "Your original string: " << input << endl; result = version2(input, "###"); cout << "Your string enhanced: " << result << endl; cout << "Your original string: " << input << endl; cout << "Resetting original string.\n"; input = copy; result = version3(input, "@@@"); cout << "Your string enhanced: " << result << endl; cout << "Your original string: " << input << endl; return 0; } string version1(const string& s1, const string& s2) { string temp; temp = s2 + s1 + s2; return temp; } const string& version2(string& s1, const string& s2) //has side effect { s1 = s2 + s1 + s2; //safe to return reference passed to function return s1; } const string& version3(string& s1, const string& s2) //bad design { string temp; temp = s2 + s1 + s2; //unsafe to return reference to local variable return temp; }

此代码可以帮助你观察与理解值返回与引用返回的区别

总结

场景值返回引用返回
返回计算结果✅ 推荐⚠️ 需确保对象有效
返回局部创建的对象✅ 安全❌ 绝对禁止
返回输入参数⚠️ 可能低效✅ 高效
返回静态数据⚠️ 可能拷贝✅ 高效
链式调用❌ 不能链式✅ 支持链式
函数修改参数❌ 不能修改✅ 可以修改
多线程安全✅ 线程安全⚠️ 需同步访问
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:14:07

重构音乐体验:lxmusic音源项目的技术创新与个性化配置

重构音乐体验&#xff1a;lxmusic音源项目的技术创新与个性化配置 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 在数字音乐版权日益严格的时代&#xff0c;音乐爱好者面临着平台分散、会员费用高…

作者头像 李华
网站建设 2026/5/1 9:54:11

你还在手动部署Agent?用Docker实现云原生批量自动化只需这5步

第一章&#xff1a;Shell脚本的基本语法和命令Shell脚本是Linux/Unix系统中自动化任务的核心工具&#xff0c;它通过解释执行一系列命令实现复杂操作。编写Shell脚本时&#xff0c;通常以“shebang”开头&#xff0c;用于指定解释器路径。脚本的起始声明 #!/bin/bash # 该行告诉…

作者头像 李华
网站建设 2026/5/1 7:17:50

必读!超实用摩擦焊机方案大推荐

《摩擦焊机哪家好&#xff1a;排名前五专业深度测评》开篇&#xff1a;定下基调在工业制造领域&#xff0c;摩擦焊机的性能优劣直接影响着产品的质量和生产效率。为了帮助对摩擦焊机感兴趣的人群挑选到合适的产品&#xff0c;我们开展了本次专业测评。本次参与测评的【参与产品…

作者头像 李华
网站建设 2026/5/1 6:12:14

揭秘VSCode中Azure QDK API文档:如何快速上手量子编程?

第一章&#xff1a;揭秘VSCode中Azure QDK API文档的核心价值Azure Quantum Development Kit&#xff08;QDK&#xff09;与 Visual Studio Code 的深度集成&#xff0c;极大提升了量子编程的开发效率。其核心之一便是内嵌于 VSCode 的 API 文档系统&#xff0c;为开发者提供实…

作者头像 李华
网站建设 2026/5/1 7:19:57

15、深入理解与配置 Cyrus SASL 认证系统

深入理解与配置 Cyrus SASL 认证系统 1. SASL 概述 SASL(Simple Authentication and Security Layer)定义了客户端与服务器间需交换的数据,但未规定通信方式,而是交由具体通信协议处理,这使得它能被 SMTP、IMAP、LDAP 等多种服务使用。它在 RFC 2554 中被引入,用于描述…

作者头像 李华
网站建设 2026/5/1 6:57:38

赋能治理现代化:道本-DeepSeek合同智能平台助力国资企业筑牢合规经营与风险防控数字屏障

在全面推进数字化转型、加快建设世界一流企业的战略背景下&#xff0c;国有企业、中央企业&#xff08;以下简称“国资企业”&#xff09;的合同管理正面临从“规范性保障”向“战略性赋能”的深刻转变。合同作为企业经营活动的核心载体与法律承诺&#xff0c;其管理质效直接关…

作者头像 李华