【C++】Справочная информация по C++ ⑤ (функция «возвращает значение ссылочного типа», когда присвоено значение lvalue)


Очень важно понимать, что возвращаемое значение функции может использоваться как 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
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

вставьте сюда описание изображения

おすすめ

転載: blog.csdn.net/han1202012/article/details/132515837