函数返回值 能作为 左值 , 是很重要的概念 , 这是实现 " 链式编程 " 的基础 ;
在 C++ 语言中 , 函数返回值 一般不会直接作为左值 , 因为 函数返回值是一个临时对象 , 一般情况下 都是当做右值使用 , 函数 返回的值都是 其 函数内部 局部变量 的 副本 , 这些 副本 不能作为左值参与赋值操作 ;
如果 是 外部通过 函数参数 传入到函数中的 指针 / 引用 , 没有必要返回 , 外部已经有了 , 你再返回一次意义不大 ;
函数普通返回值 不能做左值 ;
如果函数返回值是一个普通类型 , 那么返回的是 指定变量 的副本值 ;
下面的 fun 函数中 , 返回的是 静态变量 a 的值 ,
注意 : 这里返回的只是 a 的值 , 与静态变量无关 ;
是将 静态变量 a 复制一份 , 将复制后的 副本 10 这个数值返回了 ;
// 返回静态变量的值
int fun()
{
static int a = 10;
return a;
}
下面 的代码中 , 强行给 函数 返回的 普通变量 的 副本值 进行复制 , 报
error C2106: “=”: 左操作数必须为左值
错误信息 ;
错误代码示例 :
// 导入标准 io 流头文件
// 其中定义了 std 命名空间
#include
// 导入 std 命名空间
using namespace std;
#include
// 返回静态变量的值
int fun()
{
static int a = 10;
return a;
}
// 返回静态变量引用 , 也就是静态变量自身
int& fun2()
{
static int a = 20;
return a;
}
int main() {
fun() = 100;
return 0;
}
编译运行报错信息 :
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Hello.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(25,16): error C2106: “=”: 左操作数必须为左值
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
函数引用返回值 可以做左值 ;
下面的 fun2 函数 , 返回 局部变量 中 创建的 静态变量 a 的引用 ,
相当于 将 静态变量 的 内存地址返回回去了 ,
该 静态变量的 内存地址 直到程序结束之前 都是有效的 , 因此该引用返回值 可以正常使用 ;
该 函数返回值 可以作为 正常的变量使用 , 既可以作为左值使用 , 又可以作为右值使用 ;
// 返回静态变量引用 , 也就是静态变量自身
int& fun2()
{
static int a = 20;
return a;
}
在下面的代码中 , 先获取 fun2 函数的 引用返回值 , 将其打印出来 , 值为 10 ;
然后 再次调用 fun2 函数 , 直接将其作为左值 , 为其 赋值 100 , 然后打印 之前获取的 引用值 , 值也变为 100 ;
函数的引用返回值 可以作为 左值使用 ;
函数返回值 做 左值 代码示例 :
// 导入标准 io 流头文件
// 其中定义了 std 命名空间
#include
// 导入 std 命名空间
using namespace std;
#include
// 返回静态变量的值
int fun()
{
static int a = 10;
return a;
}
// 返回静态变量引用 , 也就是静态变量自身
int& fun2()
{
static int a = 20;
return a;
}
int main() {
// 先获取 fun2 函数返回的引用
int& a = fun2();
// 打印 引用 初始值
printf("a = %d\n", a);
// 引用类型返回值
fun2() = 100;
// 打印修改后的效果
printf("a = %d\n", a);
return 0;
}
执行结果 :
a = 20
a = 100
Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 17252)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .