IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Const限定符 -> 正文阅读

[C++知识库]Const限定符

由于C++ Primer关于const的描述逻辑有些混乱,故总结一下

一、判断原则

  1. 首先将const分为顶层const和底层const。顶层const限定的是当前变量(基本类型、指针)是个常量;底层const(引用、指针)限定其所引用(指向)的对象是个常量
    ①注意括号内容,指针既可为顶层也可为底层,引用只能是底层,基本类型(算术、字符)只能是顶层
    ②注意常量的地址属于底层const
    ③const限定指针时,const在基本类型右边为顶层const,在左边为底层const
  2. 顶层const在初始化或拷贝时,若两边均为对象(引用不是对象),则无所谓两边是否为const
  3. 底层const要求左右两边均为const。若底层const为引用,右边可为字面值。(若底层const为指针,右边应为地址,如果是字面值,则无法确定所指向的对象是什么)
  4. 非常量可以转换成常量,反之则不行(借助临时量实现,本身不会改变)

二、实例

根据判断原则,从上到下,进行判断

int i = 42;
const int ci = i; //正确:顶层const,左右两边均为对象
int j = ci; //正确:顶层const,左右两边均为对象

const int ca = 1024;
const int &r1 = ca; //正确:r1底层const,所引用的对象应是常量,ca顶层const,常量
r1 = 42; //错误:r1是对常量的引用
int &r2 = ca; //错误:ca常量,无法转换成非常量

int a = 42;
const int &ra = a; //正确:ra的const是底层const,所引用的对象应是常量,a为非常量可以转换成常量
const int &rb = 42; //正确:rb的const是底层const,所引用的对象应是常量,右边是字面值(常量)
const int &rc = ra * 2 //正确:ra、rc的const均为底层const,均为常量
int &rd = ra * 2 //错误:ra的const是底层const,所引用的对象应是常量,无法转换成非常量
ra = 0; //错误:ra的const为底层const,所引用的对象应是常量,不能修改

const double pi = 3.14;
double *ptr = π //错误:常量的地址为底层const,无法转换成非常量
const double *cptr = &pi //正确:两边均为底层const,cptr所指向的对象应是常量,而pi地址所指向的pi是常量
*cptr = 42; //错误:底层const,所指向的对象为常量,不能修改

int b = 0;
int *const p1 = &b; //正确:p1的const为顶层const,p1为常量,右边为非常量可以转换成常量
const int pa = 42;
const int *p2 = &pa; //正确:p2的const为底层const,所指的对象应为常量,右边为底层const,所指的对象pa为常量
const int *const p3 = p2; //正确:p3的const靠右的是顶层const(p3是常量),靠左的是底层const(p3所指的对象应为常量),p2所指的对象为常量
const int &r = pa; //正确:r的const为底层const(所引用对象应为常量),pa为常量
b = pa; //正确:非常量b的值可以修改为常量pa
p2 = p3; //正确:p2的const为底层const,p3的const既为顶层const,也为底层const
int *p = p3; //错误:p3的const为底层const,p非const
p2 = &b; //正确:p2的const为底层const,右边为底层const
int &x = pa; //错误:pa的const为顶层const,x是引用,不是对象,因此要求也应为const
const int &r2 = b; //正确:r2为底层const,b非常量可以转换成常量

参考

[1]《C++ Primer》(第5版)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:20:07  更:2022-03-22 20:21:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:29:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码