引用的基本用法
数据类型 &别名=原名
别名和原名使用同一块地址空间。
必须初始化,一旦初始化后不能更改。
可以赋值。相当于a,b,c指向的同一块内存。
int a = 10;
int c = 5;
int& b = a;
b = c;//赋值操作
cout << a << endl;
cout << b << endl;
cout << c << endl;
引用做函数参数
1、值传递(形参不会修饰实参)
2、地址传递(形参会修饰实参),参数是指针
void T1(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
void main() {
int a=20, b=30;
T1(&a,&b);
cout << a << endl;
cout << b << endl;
}
3、引用传递(形参会修饰实参),参数是引用
void T1(int &a, int &b) {
int t = a;
a = b;
b = t;
}
void main() {
int a=20, b=30;
T1(a,b);
cout << a << endl;
cout << b << endl;
}
引用做函数的返回值
1、不返回局部变量的引用,局部变量在栈区,离开函数会释放。
2、函数调用可以作为左值
int& T1() {
static int t = 10;
return t;
}
void main() {
int &ref=T1();
cout << ref << endl;
T1() = 1000;//返回t的引用,ref是别名,相当于t=ref=T1()
cout << ref << endl;
}
引用的本质
在c++内部实现是一个指针常量。
int& ref=a;
自动转换为int* const ref=&a;
指针常量是指针指向不可改,所以引用不可更改。
ref=20;
会自动解引用:*ref=20;
常量引用
修饰形参,防止误操作。
1、引用引用的是一块合法的内存空间。
2、
const int& ref = 10;
//编译器自动修改为int temp=10;const int& ref = temp;
ref = 20;
//const为只读,不可修改,此语句报错。
const修饰形参防止误操作。
void T1(const int& val) {
cout << val << endl; //100
}
void main() {
int a = 100;
T1(a);
cout << a<< endl; //100
}