c++规定,在创建引用的时候必须初始化。
1.在初始化的时候编译器会对右边取地址,不管你右边是什么。
2.引用在定义之后,任何使用这个引用的地方编译器都会将其变为解析地址
void test(int x) {
}
int a = 10;
int &r = a; // int const * r = &a;
r = 10; // *r = 10 <==> *(&a) = 10
test(r); // test(*r)
test(&r); // test(&(*r))
引用做函数参数或者返回值都是相当于创建引用,因为参数必须传递,返回值必须返回,所以它们
的初始化就相当于在调用函数传递实参和函数返回的时候
int a = 10;
// int const * test(int const * x){}
int & test(int &x) {
return a; // return &a
}
int t = 22;
int x = test(t); //x是a的拷贝,int x = *(&a);
/**
test(t)的返回值是引用类型
引用类型在定义之后,任何使用它的地方都会变为取地址
这里相当于是在使用引用
引用类型在初始化的时候,会变成取地址(也只有在这里是取地址,其他任何地方出现都是解析地址)
由于这一行是在初始化引用,所以需要取地址
**/
int &y = test(t); //y是a的引用, int const * y = &test(t) <==> int const * y = &(*(&a))
从上面也可以总结一点;
一个变量是引用类型还是值类型取决于它定义的时候,而不取决于它接受的东西
引申:
一个变量是什么类型只取决于它定义的时候,而不取决于它接受的东西