C++ 左值引用与一级指针
2024-10-21 04:07:03
将**左值引用**用于**一级指针**时,有以下几种用法:
```c++
//方式一:引用一级指针,常规用法
int a = 5;
int * pa = &a;
int * &rpa = pa;
//方式二:引用指向常量的一级指针,以下几种为等效表示
int a = 5;
const int * pa = &a;
const int * &rpac = pa; //方式一
int const * &rpac = pa; //方式二
//方式三:引用一级指针的常引用,引用自身为常量
int a = 5;
int * pa = &a;
int * const &crpa = pa;
//方式四:引用指向常量的一级指针,且引用自身为常量,以下几种为等效表示
int a = 5;
int * pa = &a;
const int * const &crpac = pa; //方式一
int const * const &crpac = pa; //方式二
在 Microsoft Visual Studio 中连续多个 const
会被编译器解释成一个,即 const const const const int *&
与 const int *&
等效,除此之外,const int const *&
在 Microsoft Visual Studio 中也与 const int *&
等效,而 int *& const
在 QT minGW 中将会报错,在 Microsoft Visual Studio 中与 int *&
等效。
各类型引用可修改属性如下表所示:
引用类型 | 修改 *rp |
修改 rp |
---|---|---|
int * &rp |
可以 | 可以 |
const int * &rp |
不可以 | 可以 |
int * const &rp |
可以 | 不可以 |
const int * const &rp |
不可以 | 不可以 |
若将变量的地址赋予引用(例如 rp=&x
),各类型引用可接受的变量地址如下表所示:
引用类型 | int 变量地址 |
const int 变量地址 |
---|---|---|
int * &rp |
不可以 | 不可以 |
const int * &rp |
不可以 | 不可以 |
int * const &rp |
声明时可以(将创建临时变量) | 不可以 |
const int * const &rp |
声明时可以(将创建临时变量) | 声明时可以(将创建临时变量) |
若将一级指针变量赋予引用(例如 rp=p
),各类型引用可接受的一级指针变量如下表所示。若赋值时等号右边是函数返回的临时指针变量(属于右值),则只有当等号左边为 int * const &
以及 const int * const &
类型时不会报错,此时必会创建临时变量(与 const
左值引用性质一致)。
引用类型 | int * 变量 |
const int * 变量 |
int * const 变量 |
const int * const 变量 |
---|---|---|---|---|
int * &rp |
可以 | 不可以 | 不可以 | 不可以 |
const int * &rp |
不可以 | 可以 | 不可以 | 不可以 |
int * const &rp |
声明时可以 | 不可以 | 声明时可以 | 不可以 |
const int * const &rp |
声明时可以(将创建临时变量) | 声明时可以 | 声明时可以(将创建临时变量) | 声明时可以 |
若将引用变量赋予引用(例如 rp=rp2
),各类型引用可接受的引用变量如下表所示。比较上下两表可知,左值引用类型变量被初始化完毕后,若要将其赋值给另一引用变量,赋值时的表现与所引用类型的变量相一致。
引用类型 | int *& 变量 |
const int *& 变量 |
int * const& 变量 |
const int * const& 变量 |
---|---|---|---|---|
int * &rp |
可以 | 不可以 | 不可以 | 不可以 |
const int * &rp |
不可以 | 可以 | 不可以 | 不可以 |
int * const &rp |
声明时可以 | 不可以 | 声明时可以 | 不可以 |
const int * const &rp |
声明时可以(将创建临时变量) | 声明时可以 | 声明时可以(将创建临时变量) | 声明时可以 |
最新文章
- Follow me to learn what is repository pattern
- 点击Cell中的按钮时,如何取所在的Cell
- C# 实现无焦点窗体(转载)
- How to hide an entry in the Add/Remove Programs applet?
- ActionBar官方教程(5)ActionBar的分裂模式(底部tab样式),隐藏标题,隐藏图标
- linux6.2安装mysql
- 得到一个临时的文件名称(使用GetTempFileName API函数)
- ZOJ 3795 Grouping 求最长链序列露点拓扑
- c++ string 对象操作
- CSS active选择器与CSS hover选择器
- 将搜狗词库(.scel格式)转化为txt格式
- Java基础学习笔记二十五 MySQL
- page.isvalid
- AttributeError: 'int' object has no attribute 'isdigit'(python下的isdigit函数)
- <;spark>; error:启动spark后查看进程,进程中master和worker进程冲突
- 深入理解HTTP协议及原理分析
- UWP开发细节记录:判断文件类型
- SQL server权限管理和备份实例
- jQuery 学习笔记:jQuery 代码结构
- Python raw_input和input总结 在版本2和版本3中的区别