C++中的引用

引用的基本使用
作用:给变量起别名
语法:数据类型&别名=原名,代码如下:
int main()
{
int a = 10;
int& b = a;通过引用 把变量名字改成b
b = 100;操作别名和操作原名都是操作同一块内存
cout << a << endl;
cout << b << endl;
return 0;
}
引用的注意事项:1 引用必须初始化,2 引用在初始化后,不可以改变。代码如下:
int main()
{
int a = 10;
int& b = a;初始化的样子 int& b;这种是未初始化,引用一旦初始化 就不能更改了 比如:把a改为b之后,就不能改为c了
int c = 20;
b = c;这是赋值操作,而不是更改引用
cout << a << endl;b和a指向的是同一块内存,因为b是对a的引用 所以a也是20
cout << b << endl;c的值赋给b 所以b也是20
cout << c << endl;
return 0;
}

引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
通过三种方式理解,代码如下:
void swap(int a,int b)
{
int tmp = 0;
tmp = a;
a = b;
b = tmp;
cout << a << endl;
cout << b << endl;
}
void swap2(int* a,int* b)
{
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
void swap3(int &a,int &b)通过引用来传递值 上面的a通过引用的方式 所以是下面a的别名,只不过起的名字一样,也可以在这里改成x,y
{
int tmp = 0;
tmp = a;
a = b;
b = tmp;
}
int main()交换值的函数
{
int a = 5;
int b = 3;
swap(a, b);法1 值传递 形参的改变不会影响实参,在调用的函数里面会改变,但是原函数里面的实参不会改变,因为是值传递
cout << a << endl;
cout << b << endl;
swap2(&a,&b);法2 地址传递,改变函数里面参数,实参也会改变,因为是从地址里面改变了
cout << a << endl;
cout << b << endl;
swap3(a, b);法3 引用的方式传递 形参也会修饰实参,引用传递是类似于指针类型的,所以也会改变
cout << a << endl;
cout << b << endl;
return 0;
}

不要返回局部变量的引用,局部变量放在栈区
int& test()
{
int a = 10;
return a;
}
int main()
{
int& ref = test();ref是test的别名 test是引用函数 返回a
cout << ref << endl;
cout << ref << endl;发现第二次不一样 说明是非法访问 第一次是编译器做了保留,编译器认为是误操作,所以做了保留,因为是局部变量 所以会清空 所以这里是是非法访问
return 0;
}

函数的调用作为左值
int& test2()
{
static int a = 10;加上static 使得内存不会被清除 就变成静态变量了 就在全局区了
return a;全局区的数据 在程序运行结束时释放
}
int main()
{
int& ref = test2();返回的是a的引用 等于返回的是a
cout << ref << endl;因为由static 使其变为静态变量 所以就不会是非法访问
cout << ref << endl;所以这两个其实是一样的
test2() = 1000;因为返回的是a的引用 所以这里就是对a的引用 所以可以作为左值,也就是可以修改,如果函数的返回值是引用,这个函数调用可以作为左值
cout << ref << endl;
cout << ref << endl;
return 0;
}

引用的本质:引用的本质在C++内部实现是一个指针变量(指针的指向是不可以修改的 指针的值是可以修改的),本质就是一个指针常量,代码如下:
void fun(int& ref)
{
ref = 100;
}
int main()
{
int a = 10;
int& ref = a;别名是ref 编译器认为是 int* const ref = &a; 也说明引用是不可更改的 类似于指针,指针指向不可以更改 引用也类似于这样 但是值可以改
ref = 20;内部发现是引用 这里的操作就类似于 *ref = 20; 对 指向的值进行修改
cout << a << endl;
cout << ref << endl;
fun(a);
return 0;
}

常量引用:引用必须引一块合法的内存空间,然后加上const,加上之后编译器将代码修改为int tmp = 10; int& ref=tmp; 代码如下:
const int& ref = 10;
ref = 10;加上const之后 是一个只读状态 不可以修改
void print(const int& val)通过引用的方式 把值传进来,如果这里不加const,那么原来的a就会被修改,如果加了,就不会被修改
{
//val = 1000;不加const的话 就把原来的值也修改了 为了避免原来的值被修改 所以在接收参数的时候加const
加上const 在函数里面就不能修改了 为了防止误操作
cout << val << endl;
}
int main()
{
int a = 100;
print(a);
cout << a << endl;因为是通过引用的方式去修改了a的值 所以原来的a的值也被修改了 因为指向的是同一块内存
return 0;
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lockey-s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值