• C++ 左值引用与 const 关键字


    左值引用是已定义的变量的别名,其主要用途是用作函数的形参,通过将左值引用变量用作参数,函数将使用原始数据,而不是副本。引用变量必须在声明时同时初始化,可将 const 关键字用于左值引用,如下所示:

    //声明并初始化常规左值引用变量
    int x = 55;
    int & rx = x;
    //将const关键字用于左值引用变量,以下几种为等效表示
    int x = 55;
    const int & crx = x;
    int const & crx = x;

    Microsoft Visual Studio 中连续多个 const 会被编译器解释成一个,即 const const const const int &const int & 等效,除此之外,const int const &Microsoft Visual Studio 中也与 const int & 等效,而 int & constQT minGW 中将会报错,在 Microsoft Visual Studio 中与 int & 等效。

    以上两种类型左值引用的特性如下(旧版 C++ 可能与下列特性不十分吻合,以 C++11 为准):

    • 类型为 int & 的引用 rx 只能作为已有变量的别名,不会生成临时变量,可修改所引用变量的值,可将 int 变量、int & 变量、int * 指针所指变量、int *const 指针所指变量在初始化时赋给 rx接受可通过地址访问的非 const 变量),必须在声明时初始化,后续无法更换所引用的变量。变量初始化完成后,其表现与 int 类型一致。

    • 类型为 const int & 的引用 crx 既可作为已有变量的别名,也可在合适的时候生成临时变量,成为该临时变量的别名,但不可修改所引用变量的值,可将 int 变量、const int 变量、int & 变量、const int & 变量、int * 指针所指变量、int *const 指针所指变量、const int * 指针所指变量、类型为 int 的非左值(比如字面常量 100、多项表达式 1+50*2、函数的 int 返回值)、类型不是 int 但可转换为 int 的变量或非左值(比如 short 变量、short & 变量、多项表达式 1.0+50.0*2.0、字面常量 100.0、函数的 double 返回值)在初始化时赋给 crx,也必须在声明时初始化,后续无法更换所引用的变量。变量初始化完成后,其表现与 const int 类型一致。

    常见的左值有:变量、数组元素、结构成员、引用、解除引用的指针

    常规左值引用变量的初始化用法如下:

    //初始化用法一:作为short变量别名
    short x = 55;
    short & rx = x;
    cout << x; //结果为55
    cout << rx; //结果为55
    cout << &x; //32位系统结果为0x0093F7BC
    cout << ℞//32位系统结果为0x0093F7BC
    cout << sizeof(x); //结果为2
    cout << sizeof(rx);//结果为2
    //初始化用法二:作为short变量别名,多层引用
    short x = 55;
    short & rx = x;
    short & rxx = rx;
    //初始化用法三:作为short变量别名,指针表示法,指针为short*
    short x = 55;
    short * px = &x;
    short & rx = *px;
    //初始化用法四:作为short变量别名,指针表示法,指针为short *const
    short x = 55;
    short * const px = &x;
    short & rx = *px;

    const 关键字修饰的左值引用变量初始化用法如下:

    //初始化用法一:作为short变量别名
    short x = 55;
    const short & rx = x;
    //初始化用法二:作为const short变量别名
    const short x = 55;
    const short & rx = x;
    //初始化用法三:作为short变量别名,多层引用
    short x = 55;
    short & rx = x;
    const short & rxx = rx;
    //初始化用法四:作为short变量别名,多层引用,第一层引用为const
    short x = 55;
    const short & rx = x;
    const short & rxx = rx;
    //初始化用法五:作为short变量别名,指针表示法,指针为short*
    short x = 55;
    short * px = &x;
    const short & rx = *px;
    //初始化用法六:作为short变量别名,指针表示法,指针为const short*
    short x = 55;
    const short * px = &x;
    const short & rx = *px;
    //初始化用法七:作为short变量别名,指针表示法,指针为short *const
    short x = 55;
    short *const px = &x;
    const short & rx = *px;
    //初始化用法八:作为short变量别名,指针表示法,指针为const short *const
    short x = 55;
    const short *const px = &x;
    const short & rx = *px;
    //初始化用法九:将创建临时变量,类型为int的非左值,字面常量
    const int & rx = 100;
    //初始化用法十:将创建临时变量,类型为int的非左值,多项表达式
    const int & rx = 1+50*2;
    //初始化用法十一:将创建临时变量,类型为int的非左值,函数返回int值
    const int & rx = abs(10);
    //初始化用法十二:将创建临时变量,类型不是int但可转换为int的变量
    short x = 55;
    const int & rx = x;
    cout << x; //结果为55
    cout << rx; //结果为55
    cout << &x; //32位系统结果为0x006FFCF0
    cout << ℞//32位系统结果为0x006FFCD8
    cout << sizeof(x); //结果为2
    cout << sizeof(rx);//结果为4
    //初始化用法十三:将创建临时变量,类型不是int但可转换为int的非左值,字面常量
    const int & rx = 100.0;
    //初始化用法十四:将创建临时变量,类型不是int但可转换为int的非左值,多项表达式
    const int & rx = 1.0+50.0*2.0;

    将初始化时 int &const int & 可接受的形式列个表,如下:

    初始化时可接受的形式 int & 类型 const int & 类型
    int 变量 可以 可以
    const int 变量 不可以 可以
    int & 变量 可以 可以
    const int & 变量 不可以 可以
    int * 所指变量 可以 可以
    int * const 所指变量 可以 可以
    const int * 所指变量 不可以 可以
    const int * const 所指变量 不可以 可以
    形如 100int 字面常量 不可以 可以(将创建临时变量)
    形如 1+50*2int 多项表达式 不可以 可以(将创建临时变量)
    返回类型为 int 的函数返回值 不可以 可以(将创建临时变量)
    类型可以转换为 int 的变量 不可以 可以(将创建临时变量)
    形如 100.0 可转换为 int 的字面常量 不可以 可以(将创建临时变量)
    形如 1.0+50.0*2.0 可转换为 int 的多项表达式 不可以 可以(将创建临时变量)
  • 相关阅读:
    D. Divide and Summarize(BFS+二分+预处理)
    【微搭低代码】小程序实现图片的上传和下载
    js:深拷贝与浅拷贝的区别,如何实现深拷贝
    美团面试——数据库开发岗
    学习记忆——宫殿篇——记忆宫殿——记忆桩——风景
    用于旅行商问题的离散布谷鸟算法
    RHCE之路配置本地DNS服务器的正反向解析
    引入依赖时,右键能点击进入,运行时报错
    16.Pandas实现groupBy分组统计
    python计算脚长 青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析2022年9月
  • 原文地址:https://www.cnblogs.com/young520/p/16705812.html