函数返回值是引用(引用当左值)

如果返回的是局部变量(栈上的) 引用,有可能会有问题

 

#include <iostream>
using namespace std;

int getAA1(void)
{
    int a;
    a = 10;
    return a;
}

//返回a的本身  返回a的一个副本 10
int& getAA2(void)
{
    int a;  //如果返回的是局部变量(栈上的) 引用,有可能会有问题
    a = 10;
    return a;
}

int* getAA3(void)
{
    int a;
    a = 10;
    return &a;
}

int main(void)
{
    int a1 = 0;
    int a2 = 0;

    a1 = getAA1();

    a2 = getAA2();

    int &a3 = getAA2();//若返回栈变量 不能成为其它引用的初始值
                        //a3是一个引用,相当于getAA2()函数中a的别名。
    //printf("a1:%d a2:%d a3:%d\n", a1, a2, a3);

    printf("a1:%d \n", a1);
    printf("a2:%d \n", a2);
    printf("a3:%d \n", a3);  //a3引用的是一个局部变量,运行完已经不存在了。

    return 0;
}

 

运行结果:


 

int j(void)
{
    static int a = 10;
    a++;
    return a;
}

int& j1(void)
{
    static int a = 10;
    a++;
    return a;
}
//若返回静态变量或全局变量
// 可以成为其他引用的初始值
// 即可作为右值使用,也可作为左值使用
int main(void)
{
    int a1 = 10;
    int a2 = 20;

    a1 = j();
    a2 = j1();
    int &a3 = j1();

    printf("a1:%d \n", a1);
    printf("a2:%d \n", a2);
    printf("a3:%d \n", a3);  

    return 0;
}

运行结果:

  函数返回值当左值。

 

//函数当左值
//返回变量的值
int g1(void)
{
    static int a = 10;
    a++;
    return a;  //11
}
//返回变量自身, 返回变量标识的内存空间
int& g2(void)
{
    static int a = 10;
    a++;
    printf("a:%d \n", a);

    return a; 
}

int main(void)
{
    //g1() = 100;  11=100
    g2() = 100; //函数返回值是一个引用,当左值。
    g2();

    int c1 = g1();  //函数返回值是一个值,当右值
    int c2 = g2(); //函数返回值是一个引用,当右值。
    
    printf("c1:%d \n", c1);
    printf("c2:%d \n", c2);

    return 0;
}

 

运行结果:

 

posted @ 2018-09-14 15:23  Liu_Jing  Views(1096)  Comments(0Edit  收藏  举报