You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传引用(pass by reference)与返回引用的区别及类成员函数返回类型解析

C++引用相关问题解答

1. 传引用(pass by reference)与返回引用(return by reference)的区别

  • 传引用是函数接收参数的方式:把实参的别名传给函数形参,函数内部对形参的操作直接作用于实参。核心作用是避免参数拷贝,同时支持修改实参(非const引用)或仅读取(const引用)。
  • 返回引用是函数返回值的方式:返回的是函数内部某个对象(通常是成员变量或传入的参数)的别名,调用者拿到的不是对象拷贝,而是对象本身。核心作用是避免返回值拷贝,还能让返回值作为左值被赋值(非const引用)。

2. 三个成员函数返回类型的差异

先明确三个函数的返回声明:

std::string getName1();          // 返回值类型
std::string& getName2();         // 返回非const引用
const std::string& getName3();   // 返回const引用

具体差异:

  • getName1:返回std::string值,会生成临时std::string对象(拷贝自m_name),调用者拿到的是临时对象副本,无法通过返回值修改原m_name。
  • getName2:返回std::string&非const引用,调用者拿到的是m_name的直接别名,既能读取m_name的值,还能通过返回值修改m_name(比如obj.getName2() = "new name";是合法操作)。
  • getName3:返回const std::string& const引用,调用者拿到的是m_name的只读别名,只能读取值,无法修改m_name,同时避免了拷贝。

3. getName1是否会拷贝m_name,getName2和getName3不会?

是的,默认情况如下:

  • getName1返回值类型,会触发m_name的拷贝构造函数,生成临时字符串对象返回给调用者(除非编译器启用返回值优化(NRVO),但这是编译器可选优化,并非C++标准强制要求)。
  • getName2和getName3返回的是引用,本质是返回m_name的别名,不会触发任何拷贝操作,直接绑定到原对象上。

4. 传引用与返回引用是否存在关联?

两者本质都是基于C++的引用机制——都是创建对象的别名,核心目的都是避免不必要的对象拷贝、提升程序效率。但它们的应用场景完全独立:

  • 传引用用于函数的参数传递环节,返回引用用于函数的返回值传递环节。
  • 两者没有强制绑定关系:一个函数可以用传引用接收参数但返回值用值类型,也可以返回引用但参数用值传递,完全根据需求选择。

内容的提问来源于stack exchange,提问作者Crackie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:22:22