c++ -- 引用

9 篇文章 0 订阅

目录

1. 引用基础语法  

2. 引用可以作为函数参数,函数传参时,可以用引用的技术让形参修饰实参。

3. 引用做函数的返回值

4. 引用的本质

5. 常量引用


1. 引用基础语法  

语法:数据类型 &别名 = 原名

注意事项:1. 引用必须要初始化

                         2.引用一旦初始化后便不可更改

2. 引用可以作为函数参数,函数传参时,可以用引用的技术让形参修饰实参。

优点:可以简化用指针来修改实参。

#include <iostream>
using namespace std;
// 正常函数
void MySwap1(int a, int b)
{
  int temp = a;
  a = b;
  b = temp;
}
//指针
void MySwap2(int *a, int *b)
{
  int temp = *a;
  *a = *b;
  *b = temp;
}
//引用
void MySwap3(int &a, int &b)
{
  int temp = a;
  a = b;
  b = temp;
}
int main()
{
  int a = 10;
  int b = 20;
  MySwap1(a,b)//实参 a,b不变
  cout << "a = " << a << "b = " << b << endl;//a = 10, b = 20
  MySwap2(&a,&b)//实参 a,b的值互换了
  cout << "a = " << a << "b = " << b << endl;//a = 20, b = 10
  MySwap3(a,b)//实参 a,b的值互换了
  cout << "a = " << a << "b = " << b << endl;//a = 20, b = 10
  return 0;
}

 

从上述代码可以看出,函数MySwap3和函数MySwap2两个函数执行的结果一样,MySwap2使用的是指针来实现形参修改实参,MySwap3使用引用的方式来实现用参修改实参。从代码的角度来看,使用MySwap3从定义到调用都要比函数MySwap2简洁,所以在实现中可以使用引用技术来让形参修改实参。

3. 引用做函数的返回值

需注意两点:

        a. 不要返回局部变量的引用

        b. 函数的调用可以作为左值

#include <iostream>
using namespace std;
int &test1()
{
  int a = 20;
  return a;
}
int &test2()
{
  static int a = 20;
  return a;
}
int main()
{
  //a. 不要返回局部变量的引用
  int &ref1 = test1();
  cout << "ref1 = " << ref1 << endl; //可以正确输出20
  cout << "ref1 = " << ref1 << endl; //输出乱码
  int &ref2 = test2();
  cout << "ref2 = " << ref2 << endl; //可以正确输出20
  cout << "ref2 = " << ref2 << endl; //可以正确输出20
  //b. 函数的调用可以作为左值
  test2() = 1000;
  int &ref3 = test2();
  cout << "ref3 = " << ref3 << endl; //可以正确输出,但此时值为1000
  return 0;
}

 

 

4. 引用的本质

 引用的本质是在c++内部实现一个指针常量(指针的指向不可改变,值可以改变)。

#include <iostream>
using namespace std;
int main()
{
  int a = 10;
  int &ref = a;
  //此时在c++内部会将其转换为:int *const ref = &a
  //指针常量是指针的指向不可以更改,这也说明为什么引用不可以更改     
  return 0;
}

 

5. 常量引用

作用:常量引用主要用来修饰形参,防止误操作

做法:在函数的形参列表中,可以加入const修饰形参,防止形参改变实参数。

#include <iostream>
using namespace std;
int main()
{
  int a = 10;
  int &ref = a;//正确
  int &ref = 10; //不正确,必须引用一块合法d的内存空间
  const int &ref = 10;//正确 
  //加上const之后,编译器将代码修改为: 
  //int temp = 10; const int  &ref = temp;
  ref = 20;//错误,加入const 之后 变为只读不可修改。   
  return 0;
}

 

using namespace std;
void ShowValue1(int &val)
{
  val = 1000;  
  cout << " val = " << val << endl;
}
void ShowValue2(const int &val)// 加入const 防止值在此函数内被改变
{
  val = 1000; //加入const之后,这行代码会报错 
  cout << " val = " << val << endl;
}
int main()
{
  int a = 100;
  ShowValue2(a);//此时输出的是val = 100
  cout << " a = " << a << endl;//此时输出的是a = 100
  ShowValue1(a);//此时输出的是val = 1000
  cout << " a = " << a << endl;//此时输出的是a = 1000
  return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

羽峰码字

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

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

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

打赏作者

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

抵扣说明:

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

余额充值