10_函数返回值是一个引用

/*
    函数返回值是一个引用
*/
#if 1
int getAA1()
{
    int a;
    a = 10;
    return a;//a的值返回到了寄存器里了
}

/*
    返回一个引用 
    返回a的本身 返回a的一个副本 10
*/
int& getAA2()
{
    int a;      //如果返回栈上的 引用, 有可能会有问题
    a = 10;     //函数运行完毕后 释放栈内存
    return a;   //c++编译器帮助程序员把a的地址返回出去
                //函数运行完毕后,a释放了
}

/*
    返回一个指针
*/
int* getAA3()
{
    int a;
    a = 100;
    return &a;
}

void test()
{
    int a1 = 0;
    int a2 = 0;
    int a4 = 0;
    int *p;

    a1 = getAA1();//rerurn的时候将值拷贝给了a1 

    a2 = getAA2();//用变量去接,则将副本值赋值给了a2 
    int &a3 = getAA2();  //DEBUG版本跟release版本结果不同,说明程序存在潜在的bug
    //函数返回的栈变量 不能用引用去接
    //若返回栈变量    不能成为其它引用的初始值

    printf("a1:%d \n", a1);  //a1:10
    printf("a2:%d \n", a2);  //a2:10
    printf("a3:%d \n", a3);  //a3:-2  c++编译器内部实际是 *a3,但是*a3的值是 栈变量a释放了,导致乱码

    p = getAA3();
    a4 = *p;
    printf("a4:%d    &a4:%p\n", a4, &a4);  //a4:100    &a4:00CFF870
    printf("getAA3() = %p\n", getAA3());   //getAA3() = 00CFF774
    printf("p:%p    *p = %d", p, *p);      //p:00CFF774  *p = -2 乱码

    cout << "hello..." << endl;
}
#endif
/*
    变量是static或者是全局变量
*/

#if 0

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

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

    a1 = j1();

    a2 = j2();
    int &a3 = j2();//引用 内存块的别名

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

}
#endif
/*
    函数当左值
*/
#if 1
//函数返回的是变量的值
int g1()
{
    static int a = 10;
    a++;
    return a;
}

//函数返回的是变量本身
int& g2()
{
    static int a = 10;//静态存储区
    a++;
    printf("a:%d \n", a);
    return a;
}

void test()
{
    //g1() = 100;//相当于 11=100 显然不对
    g2() = 100;  //函数返回值是一个引用,并且当左值 
    g2();

    int c1 = g1(); //函数返回值是一个值,并且当右值 
    int c2 = g2(); //函数返回值是一个引用,并且当右值
}
#endif

猜你喜欢

转载自blog.csdn.net/WUZHU2017/article/details/81182552
今日推荐