C++学习笔记07:引用做返回值

目录

一、什么是引用做返回值?

二、传值返回

三、引用返回

五、为什么static变量可以引用返回?

六、引用返回优点以及注意事项

七、小结


一、什么是引用做返回值?

在C++中,函数不仅可以返回普通值,也可以返回引用。

普通返回值写法:

cpp 复制代码
int func() {
    int a = 10;
    return a;
}

引用返回值写法:

cpp 复制代码
int& func() {
    static int a = 10;
    return a;
}

这里函数返回类型是:

cpp 复制代码
int&

表示函数返回的是一个整型变量的引用,也就是返回这个变量的别名。


二、传值返回

普通函数返回值一般是传值返回。

例如:

cpp 复制代码
#include <iostream>
using namespace std;

int func() {
    int a = 10;
    return a;
}

int main() {
    int ret = func();
    cout << ret << endl;

    return 0;
}

运行结果:

cpp 复制代码
10

这种方式是安全的。

因为函数返回时,会把a的值拷贝一份返回给外面。

但缺点是:

如果返回值是大对象,拷贝成本会比较高。


三、引用返回

引用返回不会重新拷贝一份数据,而是返回原对象的别名。

例如:

cpp 复制代码
#include <iostream>
using namespace std;

int& func() {
    static int a = 10;
    return a;
}

int main() {
    int& ret = func();

    cout << ret << endl;

    ret = 20;

    cout << func() << endl;

    return 0;
}

运行结果:

cpp 复制代码
10
20

这里func()返回的是static int a的引用。

所以:

cpp 复制代码
int& ret = func();

相当于ret成了a的别名。

后面修改ret,其实就是修改a。


四、为什么不能返回普通变局部量的引用?

下面这种写法时错误的:

cpp 复制代码
int& func() {
    int a = 10;
    return a;
}

原因是a是普通局部变量。

普通局部变量由于存放在函数栈帧中,函数调用结束后,a的空间就被释放了。

这时候在返回a的引用,相当于返回了一个已经失效的变量。

这种情况叫悬空引用。

错误示例:

cpp 复制代码
#include <iostream>
using namespace std;

int& func()
{
    int a = 10;
    return a;
}

int main()
{
    int& ret = func();

    cout << ret << endl;

    return 0;
}

这段代码虽然可能编译通过,但是结果是不靠谱的。

所以要记住:

不要反返回普通局部变量的引用。


五、为什么static变量可以引用返回?

static修饰局部变量生命周期不是函数的调用期间,而是整个程序的运行期间。

例如:

cpp 复制代码
int& func() {
    static int a = 10;
    return a;
}

虽然a写在函数内部,但是不会随着函数结束而销毁。

所以函数结束后,a仍然存在。

因此返回a的引用是可以的。

简单理解:

变量类型 函数结束后是否还存在 能不能返回引用
普通局部变量 不存在 不建议
static 局部变量 仍然存在 可以
全局变量 仍然存在 可以

六、引用返回优点以及注意事项

引用返回的最大优点:

减少拷贝,提高效率。

引用返回时,必须注意对象的生命周期。

核心规则:

返回引用时,返回对象必须是在函数结束后仍然存在的。

可以返回:

cpp 复制代码
static局部变量
全局变量
已经存在的对象成员

不要返回:

cpp 复制代码
普通局部变量
临时变量
函数内部创建但很快销毁的对象

七、小结

本篇主要学习了引用做返回值。

需要记住:

  1. 函数返回类型是可以引用的;
  2. 引用返回的是对象的别名;
  3. 引用返回可以减少拷贝,提高效率;
  4. 普通局部变量不能引用返回;
  5. static局部变量可以引用返回;
  6. 返回引用时,必须保证返回对象在函数结束后仍然存在;
  7. 引用返回使用不当会产生悬空引用。

引用做返回值时C++中比较重要的知识点,后面学习类和对象、运算符重载、STL容器时都会经常用到。

相关推荐
小超人诞生日记2 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
多弗朗皮卡丘2 小时前
C++的IO流
开发语言·c++·io流·文件io流
xiangyun613 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
SunkingYang3 小时前
C++14 vs C++17:新特性对比与用法指南
c++·新特性·用法·c++14·示例·c++17
SunkingYang4 小时前
C++ Lambda 表达式原理详解
c++·lambda·理论·原理·表达式
xiaoye-duck5 小时前
《C++ 工具库实战》GTest 单元测试:断言、全局环境、局部夹具与底层原理
c++·单元测试·第三方库
学逆向的5 小时前
C++ 匿名命名空间
开发语言·c++·网络安全
miller-tsunami5 小时前
内存管理&模板
c++·算法·内存管理·模板
青少儿编程课堂5 小时前
蓝桥杯青少组·全国青少年信息素养·电子学会Scratch考级:校园智能抢答器项目解析
c++·python·算法·bfs·信息学竞赛
充值内卷6 小时前
[特殊字符] 自己动手做一个类 tldraw 的桌面白板:StepDraw 开源啦(C++ + WebView2 + Canvas)
开发语言·c++