若是返回的是局部變量(棧上的) 引用,有可能會有問題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