写点什么

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

作者:Java-fenn
  • 2022 年 9 月 19 日
    湖南
  • 本文字数:1983 字

    阅读完需:约 7 分钟

左值引用是已定义的变量的别名,其主要用途是用作函数的形参,通过将左值引用变量用作参数,函数将使用原始数据,而不是副本。引用变量必须在声明时同时初始化,可将 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 & const 在 QT 中将会报错,在 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 * 指针所指变量、 const int *const 指针所指变量、 类型为 int 的非左值 (比如字面常量 100 、多项表达式 1+50*2 )、 类型不是 int 但可转换为 int 的变量或非左值 (比如 short 变量、多项表达式 1.0+50.0*2.0 、字面常量 100.0 )在初始化时赋给 crx ,也必须在声明时初始化,后续无法更换所引用的变量。变量初始化完成后,其表现与 const int 类型一致。

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

//初始化用法一:作为short变量别名short x = 55;short & rx = x;cout << x;  //结果为55cout << rx; //结果为55cout << &x; //32位系统结果为0x0093F7BCcout << ℞//32位系统结果为0x0093F7BCcout << sizeof(x); //结果为2cout << 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 *constshort 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变量别名,多层引用,第一层引用为constshort 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 *constshort x = 55;short *const px = &x;const short & rx = *px;
//初始化用法八:作为short变量别名,指针表示法,指针为const short *constshort 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的变量short x = 55;const int & rx = x;cout << x; //结果为55cout << rx; //结果为55cout << &x; //32位系统结果为0x006FFCF0cout << ℞//32位系统结果为0x006FFCD8cout << sizeof(x); //结果为2cout << sizeof(rx);//结果为4
//初始化用法十二:将创建临时变量,类型不是int但可转换为int的非左值,字面常量const int & rx = 100.0;
//初始化用法十三:将创建临时变量,类型不是int但可转换为int的非左值,多项表达式const int & rx = 1.0+50.0*2.0;
复制代码

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


用户头像

Java-fenn

关注

需要Java资料或者咨询可加我v : Jimbye 2022.08.16 加入

还未添加个人简介

评论

发布
暂无评论
C++ 左值引用与 const 关键字_Java_Java-fenn_InfoQ写作社区