如果返回的是局部变量(栈上的) 引用,有可能会有问题
#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 ", a1, a2, a3); printf("a1:%d ", a1); printf("a2:%d ", a2); printf("a3:%d ", 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 ", a1); printf("a2:%d ", a2); printf("a3:%d ", 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 ", a); return a; } int main(void) { //g1() = 100; 11=100 g2() = 100; //函数返回值是一个引用,当左值。 g2(); int c1 = g1(); //函数返回值是一个值,当右值 int c2 = g2(); //函数返回值是一个引用,当右值。 printf("c1:%d ", c1); printf("c2:%d ", c2); return 0; }
运行结果: