第6.4章: 返回值

English

概述

函数可以使用 return 语句产出一个值并把它交还给 调用者。理解返回值如何工作,对于编写有意义的函数至关重要。

在本章中,你将学到:

1. 基本返回

返回类型不是 void 的函数必须返回一个值。


int add(int a, int b)
{
    return a + b;
}

return 之后的表达式成为该函数调用的值。


int x = add(3, 4);   // x == 7

2. 返回对象

函数可以像返回整数一样返回对象。


::fast_io::string greet()
{
    return ::fast_io::string("Hello from fast_io!");
}

int main()
{
    ::fast_io::string s = greet();
    ::fast_io::io::println(s);
}

现代 C++ 会执行返回值优化(RVO),所以返回对象的效率很高。

3. 提前返回

函数可以包含多个 return 语句。 第一个被执行的语句会立即结束函数。


int classify(int x)
{
    if(x < 0)
        return -1;

    if(x == 0)
        return 0;

    return 1;
}

提前返回通常比深层嵌套的 if 语句更清晰。

4. 返回引用

函数可以返回引用。 这让调用者能够访问或修改原对象。


int & max_ref(int & a, int & b)
{
    return (a > b) ? a : b;
}

int main()
{
    int x{10};
    int y{20};

    int & r = max_ref(x, y);
    r = 100;   // modifies y

    // x == 10, y == 100
}

返回引用很强大,但必须谨慎使用。

5. 永远不要返回局部变量的引用

局部变量在函数结束时被销毁。 返回对它的引用会产生悬垂引用。


int & bad()
{
    int x{42};
    return x;   // ❌ ERROR — x is destroyed when the function ends
}

使用这样的引用是未定义行为。

如果你需要返回一个值,请按值返回:


int good()
{
    int x{42};
    return x;   // ✔ OK — returns a copy
}

6. 返回 T const &

返回 const 引用在以下情况很有用:


::fast_io::string const & get_global()
{
    static ::fast_io::string g("Hello");
    return g;   // ✔ OK — static objects live for the entire program
}

返回静态对象的引用是安全的,因为它永远不会离开作用域。

要点