引用必须是可以被赋值的东西,不可以是常量
char c;
char *p = &c;
char &r = c; // 引用
一般的引用都需在定义的时候给他一个初始值,初始值必须是一个变量,或是一个可赋值的东西
r是c的一个别名。
int x = 47;
int &y = x;// 引用
// x and y now refer to the same variable
cout << "y = " << y; // 47
y = 18; // 是对引用的变量的赋值
cout << "x = " << x; // 18
加上const的引用
const int& z= x;
// z是x的别名,但是不能通过z修改x的值,z不能被赋值
z = 18; // error!
// x的值仍然可以变,x的值变了,z的值也对应发生变化(z是x的别名)
函数调用
void f(int& x);
f(y) // initialized when function is called
此时x就是y的reference,如果在f里面对 x变化 那么外面的y也就变化了
引用的绑定不能变化
the target of a reference must have a location
void func(int &);
func(i * 3); // warning or error!
因为i 3 没有地方:只有结果,没有一个有名字的变量存储这个结果*
ps: 引用就是指针,不同的是 引用的地址不能变化。而指针指向的地址可以变化
int* f(int* x){ (*x)++; return x; // safe, x is outside this scope } int& g(int& x){ x++; // same effect as in f() return x;// safe, x is outside this scope }
易错点
int x;
int& h(){
int q;
return q; // error! 因为q是一个本地变量
return x; // safe, x is outside this scope
}
int main(){
int a = 0;
f(&a); // ugly (but explicit)
g(a); // clean (but hidden)
// !!!!
h() = 16 ; // 这是可以的!!! 此时是 全局变量x被赋值为16
}
在c++中 看到g(a), 无法保证 a的值是不会修改的 有可能不是c里面的形参,而是实参
无法构成overload
int& g(int& x){}
int g(int x){}
// 无法构成重载,在调用g函数的时候无法区分
指针和引用

实际上,引用的实现就是在指针上实现的。就是 const point

1093

被折叠的 条评论
为什么被折叠?



