第6.4章: 返回值
概述
函数可以使用 return 语句产出一个值并把它交还给
调用者。理解返回值如何工作,对于编写有意义的函数至关重要。
在本章中,你将学到:
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
}
返回静态对象的引用是安全的,因为它永远不会离开作用域。
要点
return结束函数并产出一个值。- 函数可以返回内建类型或对象。
- 提前返回可提升清晰度。
- 返回引用允许修改原对象。
- 永远不要返回局部变量的引用。
- 返回
T const &对大型、长寿的对象很有用。