C++ 引用

本文详细介绍了C++中的引用,包括其作为变量别名的特性,引用的初始化与不可变性,以及在函数参数中的应用。通过实例展示了引用如何在不创建新内存的情况下改变变量值,并探讨了引用与指针的区别,强调了引用的安全性。此外,还讨论了引用在类型转换和表达式引用中的作用,以及在函数调用中如何利用引用实现值的交换。
摘要由CSDN通过智能技术生成
C++ (3)C++对C语言的提高(引用)
  • 变量名,本身是一段内存的引用,即别名.引用可以看作一个已定义变量的别名.
  • 对变量声明一个引用时,并不另外开辟内存单元,例如int &b = a,则ba都代表同一个内存单元(使用sizeof()测a、b的大小是相同的)引用和被引用的变量有相同的地址
  • 在声明一个引用时,必须同时初始化,即声明它代表哪一个变量
  • 引用在初始化后不能再被重新声明为另一个变量的引用(即别名)
  • &符号前有数据类型时,是引用;其它都是代表取地址
  • 引用所占用的大小跟指针是相等的,引用可能是一个“常指针” int * cosnt p
  • 对引用的初始化,可以是一个变量名,也可以是另一个引用.如int a =3; int &b =a; int &c = b; 此时,整形变量a有两个别名
  • 不能建立void类型的引用(但是有void* 类型指针(万能指针))不能建立引用的数组(可以有指针数组)
    看一些例子:
void TestReference1(){
   int a = 1;
   int &b = a;   //b是a的别名
   std::cout<<&a<<std::endl;
   std::cout<<&b<<std::endl; //地址相同

   a = 2;
   b = 3; 
   int &c = b;   //c是b的别名
   c = 4;    
   std::cout<<"a = "<<a<<" b = "<<b<<" c ="<<c<<std::endl;
 }

0x7ffd230cb664
0x7ffd230cb664
a = 4 b = 4 c =4

可以对一个变量进行常引用(此时引用不可以修改,但是原变量可以修改),这个特征一般是用在函数的形参修饰上,有时候不希望改变原来的实参值

  int d1 = 1;
  const int &d2 = d1; //d2是d1的别名

  std::cout<<"d1 = "<<d1<<" d2 = "<<d2<<std::endl;
  d1 = 2;           //d1改变d2的值也会改变
  //d2 = 3;        //error
  std::cout<<"d1 = "<<d1<<" d2 = "<<d2<<std::endl;
  //当不希望函数内改变参数x的值时,尽量使用常引用传参
  void showInf(const Stu& x){
   ...
  }

对一个常量进行引用时牢记:常量具有常性,只有常引用可以引用常量

  const int d3 = 4;
  const int &d4 = d3;
  //int &d5 = d3; //error
  const int &d6 = 5; //只有常引用可以引用常量
  std::cout<<"d3 = "<<d3<<" d4 = "<<d4<<" d6 = "<<d6<<std::endl;

d3 = 4 d4 = 4 d6 = 5

引用时发生类型转换:临时变量做桥梁

  double d7 = 1.1;
  //int &d8 = d7; //d7是double类型,d8是int,d7赋值给d8时要生成一个临时变量
                  //也就是说d8引用的是这个带有常性的临时变量,所以不能赋值
  //int tmp = d7;const int &d9 = tmp;
  const int &d9 = d7;
  std::cout<<"d7 = "<<d7<<" f= "<<d9<<std::endl;

d7 = 1.1 f= 1

对表达式做引用

  //内部系统处理 int tmp = e + 10; const int &f = tmp;
  int e = 5;
  const int &f = e + 10; //ok
  std::cout<<"e = "<<e<<" f= "<<f<<std::endl;

e = 5 f= 15

引用作函数参数 swap的经典例子(哪个能起到swap的作用?)
如果形参为非引用的传值形式,则生成局部临时变量接收实参的值

//值传递(不行)
void swap(int a, int b){
  int tmp = a;
  a = b;
  b = tmp;
}

如果形参为引用类型,则形参是实参的别名

//引用传递
void swap(int &m, int &n){
  int tmp = m;
  m = n;
  n = tmp;
}

指针传递

void swap(int *a, int *b){
  int tmp = *a;
  *a = *b;
  *b = tmp;
}

传值做返回值&传引用做返回值

  int& add(int d1, int d2){
     return d1+d2;
  }

**补充:引用和指针的区别和联系**

  • 引用只能在定义时初始化一次,之后不能改变指向其它变量;指针变量的值可变
  • 引用必须指向有效的变量;指针可以为空
  • sizeof指针对象和引用对象的意义不一样.sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小
  • 指针和引用自增(++)和(- -)意义不一样
  • 相对而言,引用比指针更安全.使用指针时一定要注意检查指针是否为空,指针所指向的地址释放后最好置0,否则可能存在野指针问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值