首页 > 编程语言 >C++ 左值引用与一级指针

C++ 左值引用与一级指针

时间:2022-09-21 00:00:46浏览次数:76  
标签:const 变量 int 可以 左值 C++ 引用 rp 指针

左值引用用于一级指针时,有以下几种用法:

//方式一:引用一级指针,常规用法
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 *& constQT 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 声明时可以(将创建临时变量) 声明时可以 声明时可以(将创建临时变量) 声明时可以

标签:const,变量,int,可以,左值,C++,引用,rp,指针
From: https://www.cnblogs.com/young520/p/16714145.html

相关文章

  • C++07_std::tuple、std::optional、std::variant、std::visit
    std::tuplestd::tuple常用容器:tuplestd::tuple<...>可以将多个不同类型的值打包成一个。尖括号里填各个元素的类型。之后可以用std::get<0>获取第0个元素,std::get<1>......
  • C++05_模板元编程
    模板函数为什么需要模板函数(template)避免重复写代码inttwice(inti){returni*2;}floattwice(floatf){returnf*2;}doubletwice(doubled)......
  • C++06_函数式编程
    函数也是对象函数可以作为另一个函数的参数:#include<cstdio>template<classFunc>voidcall_wait(Funcfunc){func(0);func(1);}intmain(){au......
  • T1031:反向输出一个三位数(信息学一本通C++)
     目录[题目描述]将一个三位数反向输出,例如输入358,反向输出853。[输入]一个三位数n。[输出]反向输出n。[输入样例]100[输出样例]001 #include<iostream>u......
  • T1033:计算线段长度(信息学一本通C++)
     目录[题目描述]已知线段的两个端点的坐标A(Xa,Ya),B(Xb,Yb),求线段AB的长度,保留到小数点后3位。[输入]第一行是两个实数Xa,Ya,即A的坐标。第二行是两个实数Xb,Yb,即B的......
  • T1035:等差数列末项计算(信息学一本通C++)
     目录[题目描述]给出一个等差数列的前两项a1,a2,求第n项是多少。。[输入]一行,包含三个整数a1,a2,na1,a2,n。−100≤a1,a2≤100,0<n≤1000。[输出]一个整数,即第n项的值。。......
  • T1034:计算三角形面积(信息学一本通C++)
     目录[题目描述]平面上有一个三角形,它的三个顶点坐标分别为(x1,y1),(x2,y2),(x3,y3),那么请问这个三角形的面积是多少,精确到小数点后两位。[输入]输入仅一行,包括......
  • T1037:计算2的幂(信息学一本通C++)
     目录[题目描述]非负整数n,求2^n,即2的n次方。。[输入]一个整数n。0≤n<31。[输出]一个实数,即线段AB的长度,保留到小数点后3位。[输入样例]2[输出样例]8 ......
  • C++ shared_ptr
    shared_ptrshared_ptr是C++11提供的一种智能指针类,它足够智能,可以在任何地方都不使用时自动删除相关指针,从而帮助彻底消除内存泄漏和悬空指针的问题。shared_ptr使用引......
  • T1036:A*B问题(信息学一本通C++)
     目录[题目描述]输入两个正整数A和B,求A*B的值。注意乘积的范围和数据类型的选择。[输入]一行,包含两个正整数A和B,中间用单个空格隔开。1≤A,B≤50000。[输出]两......