1 #include <iostream> 2 using namespace std; 3 4 int getA1() 5 { 6 int a; 7 a = 10; 8 return a; //复制一份交给主函数相关变量,然后自己消失,只是返回一个值,可能存在于除内存外的其他地方. 9 } 10 11 int& getA2() 12 { 13 int a; 14 a = 10; 15 return a; //将自己将给主函数相关变量,然后自己消失,返回的是变量本身,再底层的讲,返回的是该变量的内存首地址.只是在接受方知道这里是返回引用的话,会自动加*号取值,当然这都是C++编译器做的. 16 } 17 18 int main() 19 { 20 int a1 = 0; 21 int a2 = 0; 22 23 a1 = getA1(); //得到的是复制体,返回的只是一个值.返回不能当左值. 正体在函数体返回(右大括号)的时候就销毁了,复制体由=号操作赋值给了a1之后,自我销毁 24 a2 = getA2(); //得到的是getA2本身,但因为a2本身开辟了内存,所以能够保存值.返回可以当左值.没有复制体,a2得到的是getA2正体,在=号操作赋值给了a2之后,自我销毁 25 26 int &a3 = getA2(); //用a3去引用getA2返回的变量本身. 27 28 printf("a1:%d ", a1); 29 printf("a2:%d ", a2); 30 printf("a3:%d ", a3); 31 printf("123"); 32 printf("a2:%d ", a2); 33 34 cin.get(); 35 return 0; 36 } 37 38 int *j() 39 { 40 static int a = 10; 41 a++; 42 return &a; 43 } 44 45 int main11() 46 { 47 j(); 48 j(); 49 //int *p = j(); 50 51 printf("%d ", *(j())); //输出13 52 return 0; 53 }
const& 相当于 int const *const a
&相当于 int *const a
当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名