C++ 左值引用const 关键字
木三百川 人气:0左值引用是已定义的变量的别名,其主要用途是用作函数的形参,将 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 & 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 *
指针所指变量、类型为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 所指变量 | 不可以 | 可以 |
形如 100 的 int 字面常量 | 不可以 | 可以(将创建临时变量) |
形如 1+50*2 的 int 多项表达式 | 不可以 | 可以(将创建临时变量) |
返回类型为 int 的函数返回值 | 不可以 | 可以(将创建临时变量) |
类型可以转换为 int 的变量 | 不可以 | 可以(将创建临时变量) |
形如 100.0 可转换为 int 的字面常量 | 不可以 | 可以(将创建临时变量) |
形如 1.0+50.0*2.0 可转换为 int 的多项表达式 | 不可以 | 可以(将创建临时变量) |
加载全部内容