Каталог статей
Очень важно понимать, что возвращаемое значение функции может использоваться как lvalue, что является основой для реализации «цепного программирования»;
1. Возвращаемое значение функции не может быть ссылкой или указателем на «локальную переменную».
1. Общее использование возвращаемого значения функции
В языке C++ возвращаемое значение функции обычно не используется напрямую как lvalue, поскольку возвращаемое значение функции является временным объектом, который обычно используется как rvalue, а значение, возвращаемое функцией, является копией. локальной переменной внутри функции Копия не может участвовать в операции присваивания в качестве lvalue;
Если это внешний указатель/ссылка, переданная в функцию через параметры функции, то возвращать нет необходимости, он уже есть у внешнего, и вам не имеет смысла возвращать его снова;
2. Проанализируйте ситуацию, когда «обычное возвращаемое значение» функции является lvalue.
Обычное возвращаемое значение функции не может быть lvalue;
Если возвращаемое значение функции является общим типом, то возвращается значение копии указанной переменной;
В приведенной ниже функции fun возвращается значение статической переменной a,
Примечание. Здесь возвращается только значение a, которое не имеет ничего общего со статическими переменными;
Это значит сделать копию статической переменной a и вернуть значение скопированной копии 10;
// 返回静态变量的值
int fun()
{
static int a = 10;
return a;
}
В следующем коде принудительно копируется значение копии обычной переменной, возвращаемой функцией, и
error C2106: “=”: 左操作数必须为左值
сообщение об ошибке;
Пример кода ошибки:
// 导入标准 io 流头文件
// 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;
#include <stdio.h>
// 返回静态变量的值
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 个 ==========
3. Проанализируйте ситуацию, когда функция «возвращаемое значение ссылки» является lvalue.
Возвращаемое значение ссылки на функцию может быть lvalue;
Приведенная ниже функция fun2 возвращает ссылку на статическую переменную, созданную в локальной переменной.
Это эквивалентно возврату адреса памяти статической переменной обратно:
Адрес статической переменной в памяти действителен до конца программы, поэтому возвращаемое значение ссылки можно использовать обычным образом;
Возвращаемое значение этой функции можно использовать как обычную переменную, как lvalue, так и rvalue;
// 返回静态变量引用 , 也就是静态变量自身
int& fun2()
{
static int a = 20;
return a;
}
В следующем коде сначала получите ссылочное возвращаемое значение функции fun2, распечатайте его, и значение будет равно 10;
Затем снова вызовите функцию fun2, напрямую используйте ее как lvalue, присвойте ей значение 100, а затем напечатайте полученное ранее опорное значение, и значение станет 100;
Возвращаемые значения ссылки на функцию могут использоваться как lvalues;
Возвращаемое значение функции как пример кода lvalue:
// 导入标准 io 流头文件
// 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;
#include <stdio.h>
// 返回静态变量的值
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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .