函數返回值是引用(引用當左值)

若是返回的是局部變量(棧上的) 引用,有可能會有問題ios

 

#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;
}

運行結果:spa

  函數返回值當左值。code

 

//函數當左值
//返回變量的值
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;
}

 

運行結果:blog

相關文章
相關標籤/搜索