C++中的引用(二)

常引用、左值和右值

(1)使用const关键字修饰的引用即为常引用,不能通过常引用修改引用的目标;

  • a)const 类型&引用名=变量;
  • b)类型const& 引用名=变量;//和上面等价
    (2)普通的引用也叫左值引用,只能引用左值;而常引用也叫万能引用,既能引用左值也能引用右值;
    (3)左值和右值
  • a)左值(lvalue):可以放在赋值操作符左边,可以被修改;
  • b)右值(rvalue):之恶能放在赋值操作符右边,不能被修改。

常引用即是加上const修饰的引用,不能通过常引用直接修改其引用的目标变量。语法形式为定义时候加上const修饰,注意const修饰的位置,可以加到类型的前面,也可以加到类型的后面,但是必须加到"&"的前面,const放到类型前面或下面都可以。常引用主要是为了防止对应用的目标做意外的修改,只读访问的话可以加const修饰,例如:做一些函数的接口,没有const修饰可以随意修改,有const则会受到一些限制。本质还是别名,加上const后对别名的使用有些限制,例如每个人在正式场合都有一个和身份证上相同的名字,而在家里可能会有一些昵称,这个昵称在家里和家人间可以使用,但是工作场合等其他正式场合不适合用昵称。在开发中,需要对变量进行限制的话,就可以使用常引用。
普通的引用是左值引用,只能引用左值,而常引用也叫万能引用,可以引用左值也可以引用右值。在C++标准98中没有左值引用的概念,只有普通引用和常引用,但是在c++11标准中扩展了右值引用,就将普通引用称为是左值引用了,现在所说的左值引用就是普通引用,只能引用左值,即就只能有一些普通变量,左值一般指的是可以放在赋值符号操作符的左边的、可以被修改的数据。常引用也叫万能引用,既能引用左值又能引用右值,区别左值和右值的判断的一般方法:左值是指可以放在赋值操作符左边,可以被修改的;右值是指只能放在赋值操作符右边,不能被修改的。


//06constRef.cpp
#include <iostream>
using namespace std;

int main(void)
{
    /*定义引用时需要加"&",
    需要初始化,类型需要
    保持一致,但是这行代
    码编译会出问题,会编
    译报错。报错内容:
    error:invalid initialization 
    of non-const reference of
     type'int&' from an rvalue 
     of type 'int', 100是右值,
     不可以被修改的,
     只能放在赋值符号
     右侧的,不能放在
     左侧的。因为不能
     写 “100=20;”的代码,
     因此下面的代码语法
     上强制要求需要引用
     一个右值,普通的引
     用不行。*/
 //   int &r =100;//error
    
    /*换为常引用即可。
    const修饰的常引用,
    通过它不可以修改目
    标,而100这个右值
    就是不可修改的,
    100你是常量,你是
    不能够被修改的,
    而常引用就是只读
    不改,前后语义
    逻辑不矛盾,因
    此通过常引用对
    其进行初始化是可以的。*/
    const int& r=100;//ok
    cout<<r <<endl;//100
   
    int c=200;
    /*应该是编译报
    错的,有人认为原因在
    于类型不一致
    ,那一个整型的常
    量不应该可以隐式
    地转换为char类型
    吗,因为类型转换之
    后类型就一致了?
    确实可以隐式转换,
    需要注意,隐式转
    换的结果是一个右
    值,语法上会将
    转换的结果放到
    一个临时变量中
    ,临时变量是系统
    来分配的,看不
    见,摸不到,没办
    法分配,因此,是
    引用了一个右值才
    报错的,临时变量
    都是右值。过程如下:
    1)将c转换为char类型,转换结果保存到临时变量中;
    2)rc实际引用临时变量,而临时变量是右值
    因为引用右值而报错的,而不是引用的是c,*/
   // char & rc=c;//error
    /*代码这么写应该是
    可以正常通过编译
    的,但是在数值上
    有可能超出了char类
    型的容量,char类型变
    量能表示的最大的数
    据是127,若是超过
    的话,最高位置为1的
    话就会变为负值,若
    是无符号的话应该是
    可以正常表示的,现
    在是有符号的因此为127,
    因此现在结果为负数是
    正常的现象。*/
    const char& rc= c;//ok
    cout<< (int)rc <<endl;//-56
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值