int a = 3;
int &ra = a; // 创建a的引用
引用的本质
int main() {
int a = 3;
int &ra = a; // 创建a的引用
int * const rb = &a; // 引用的本质是指针常量,引用一旦创建必须初始化,并且引用的指向将不能改变
cout<<"a的地址:"<<&a<<" a的值:"<<a<<endl;
cout<<"ra的地址:"<<&ra<<" ra的值:"<<ra<<endl;
cout<<"rb的地址:"<<rb<<" a的值:"<<*rb<<endl;
cout << "==================="<<endl;
ra = 6;
cout<<"a的地址:"<<&a<<" a的值:"<<a<<endl;
cout<<"ra的地址:"<<&ra<<" ra的值:"<<ra<<endl;
cout<<"rb的地址:"<<rb<<" a的值:"<<*rb<<endl;
return 0;
}

引用用于函数的参数
引用传递形参的改变,会影响原有的参数。
void swap(int &ra, int &rb) {
int temp;
temp = ra;
ra = rb;
rb = temp;
}
int main() {
int a = 3;
int b = 4;
swap(a, b);
cout<<"a:"<<a<<" b:"<<b<<endl;
return 0;
}

使用引用简化二级指针传参
#include <iostream>
using namespace std;
void fun1(int **p) {
*p = new int(3);
cout <<" fun1的地址:"<< *p << " fun1的值:"<<**p<<endl;
}
void fun2(int *&p) {
p = new int(5);
cout <<" fun1的地址:"<< p << " fun1的值:"<<*p<<endl;
}
int main() {
int *p = nullptr;
fun1(&p);
cout <<" main的地址:"<< p << " main的值:"<<*p<<endl;
cout <<"--------------"<< endl;
fun2(p);
cout <<" main的地址:"<< p << " main的值:"<<*p<<endl;
return 0;
}

引用用于函数返回值
- 如果返回局部变量的引用,其本质是野指针
int& fun() {
int i = 10;
return i;
}
int main() {
int& a = fun();
return 0;
}
- 可以返回函数的引用参数,类的成员,全局变量,静态成员
//返回静态成员
int& fun() {
static int i = 10;
return i;
}
int main() {
int& a = fun();
cout << "a = "<<a<<endl;
return 0;
}
// 返回函数形参
int& fun(int &rb) {
rb++;
return rb;
}
int main() {
int a = 5;
int &rb = fun(a);
cout << "a = "<<a<<" rb = "<<rb<<endl;
return 0;
}
- 返回非const引用的函数可以作为一个左值
int& fun(int &rb) {
rb++;
return rb;
}
int main() {
int a = 5;
fun(a) = 33;
cout << "a = "<<a<<endl;
return 0;
}

网友评论