若是返回的是局部变量(栈上的) 引用,有可能会有问题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