/*
函数返回值是一个引用
*/
#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