【C++】Detalles de referencia de C++ ⑤ (La función "valor de retorno del tipo de referencia" cuando se asigna el valor l)


Es un concepto muy importante que el valor de retorno de una función se puede utilizar como valor l, que es la base para realizar la "programación en cadena";





1. El valor de retorno de la función no puede ser una referencia o un puntero a una "variable local"




1. Uso común del valor de retorno de la función


En el lenguaje C ++, el valor de retorno de una función generalmente no se usa directamente como un valor l, porque el valor de retorno de una función es un objeto temporal, que generalmente se usa como un valor r, y el valor devuelto por una función es una copia. de la variable local dentro de la función . Una copia no puede participar en una operación de asignación como un valor l;

Si se trata de un puntero/referencia externo pasado a la función a través de los parámetros de la función, no es necesario devolverlo, el externo ya lo tiene y no tiene sentido que lo devuelva nuevamente;


2. Analice la situación en la que el "valor de retorno ordinario" de la función es un valor l


El valor de retorno normal de una función no puede ser un valor l;


Si el valor de retorno de la función es de tipo común, entonces se devuelve el valor de copia de la variable especificada;

En la función divertida a continuación, lo que se devuelve es el valor de la variable estática a,

Nota: Lo que se devuelve aquí es sólo el valor de a, que no tiene nada que ver con variables estáticas;

Es hacer una copia de la variable estática a y devolver el valor de la copia copiada 10;

// 返回静态变量的值
int fun()
{
    
    
    static int a = 10;
    return a;
}

En el siguiente código, se fuerza la copia del valor de copia de la variable normal devuelta por la función, y el

error C2106:=: 左操作数必须为左值

mensaje de error;


Ejemplo de código de error:

// 导入标准 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;
}

Compilar y ejecutar mensaje de error:

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==========

inserte la descripción de la imagen aquí


3. Analice la situación en la que la función "valor de retorno de referencia" es un valor l


El valor de retorno de una referencia de función puede ser un valor l;


La siguiente función fun2 devuelve una referencia a la variable estática a creada en la variable local,

Es equivalente a devolver la dirección de memoria de la variable estática,

La dirección de memoria de la variable estática es válida hasta el final del programa, por lo que el valor de retorno de la referencia se puede utilizar normalmente;

El valor de retorno de esta función se puede utilizar como una variable normal, tanto como valor l como valor r;

// 返回静态变量引用 , 也就是静态变量自身
int& fun2()
{
    
    
    static int a = 20;
    return a;
}

En el siguiente código, primero obtenga el valor de retorno de referencia de la función fun2, imprímalo y el valor es 10;

Luego llame a la función fun2 nuevamente, úsela directamente como un valor l, asígnele un valor de 100 y luego imprima el valor de referencia obtenido antes, y el valor se convierte en 100;

Los valores de retorno de referencia de función se pueden utilizar como valores l;


Valor de retorno de la función como ejemplo de código 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;
}

Resultados de:

a = 20
a = 100

Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 17252)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/han1202012/article/details/132515837
Recomendado
Clasificación