建议直接看总结和比较,如有需要再看2.4.1—2.4.3了解细节

2.4.1 const之于基本类型(base type)

含义

const int i = 43为例

  • i的值不可修改

  • 因此在定义i必须初始化

  • 任何试图修改i的操作都会报错

const int i = get_size();  //ok
const int j = 42; //ok
const int k; //error:未初始化
j = 2; //error:试图修改j的值

编译过程

const int i = 43为例

  • 编译时,编译器会把i全部替换为43
  • 多文件编译时,如果i要在多文件中共用
    • 注意点:const修饰符修饰指针本身

    • 在定义i文件时也要externextern const int i = 43;

    • 注:一般文件在多文件共用时只需要在声明时extern

2.4.2 const之于引用

含义

  • const int &r1 = i指我们无法通过引用r1来改变它所捆绑的对象i的值
  • const引用必须初始化【只要是引用都必须如此】

作用

  • const对象必须用const引用来绑定,但const引用不一定指向const对象

  • const引用可以绑定类型不完全匹配的对象

    • #include<iostream>
      using namespace std;
      int main(){
      coint i = 3;
      double pi = 3.14; //pi加上const也可以
      const int &r1 = i; //对应类型的plain对象
      const int &r2 = pi; //自动类型转换的对象
      const int &r3 = 3.14; //自动类型转换的字面量
      //输出为“3 3 3”
      cout<<r1<<" "<<r2<<" "<<r3<<endl;
      return 0;
      }
  • 注:在const引用绑定自动转换对象时,编译器其实生成了一个临时变量

    double pi = 3.14;
    const int &r2 = pi; //上述代码 在编译时发生了如下过程
    const int tmp = pi; //编译器生成了一个临时const变量并进行了类型转换
    const int &r2 = tmp; //把临时const变量和r2绑定

注意点

  • const引用绑定的不一定是const对象

    • 我们无法通过const引用来改变它所绑定的对象
    • 不代表它所绑定的对象本身无法改变
  • 注意必须初始化

2.4.3 const之于指针

含义【两类】

  • const 修饰指针指向的对象const int *p:无法通过指针修改指向对象

    • const 对象必须用const指针指向,但const指针不一定指向const对象
    • 定义时必须初始化
    #include<iostream>
    using namespace std;
    int main(){
    double pi = 3.14;
    const double *p = &pi;
    *p = 2.2; //error:无法通过p修改pi
    pi = 2.2; //pi本身可以修改
    //输出“2.2 2.2”
    cout<<pi<<" "<<*p<<endl;
    return 0;
    }
  • const 修饰指针对象本身 int * const p:无法修改指针的指向对象

    #include<iostream>
    using namespace std;
    int main(){
    double pi = 3.14;
    double f = 2.2;
    double *const p = &pi;
    p = &f; //error:无法修改p的指向对象
    return 0;
    }

变量定义的读法:从左往右

const double *const pip = &pi;

  • const pip : pip是一个const变量,它的值无法改变
  • *const pip* : pip是一个指针,指针的值无法改变,即指针指向的对象无法改变
  • const double *const pip : pip指向的对象的类型是pip【含义是无法通过pip改变对象的值】

如何理解最后一行?

const之于三种类型的总结比较

明确各个const的含义

代码 const的含义 必须初始化
const int i = 1 无法改变i的值
const int &r = i 无法通过r改变i的值
const int *p = &i 无法通过p改变i的值
int *const p 无法改变p指向的对象
  • t 对象要建立引用必须用const 引用,建立指针必须用const int *p`
  • const 引用可以绑定不完全匹配的对象和常量

2.4.3 顶层const(Top-Level const)

含义

  • 顶层const(Top-Level const):对象本身是const【值不可变】,可修饰所有数据类型

    • const int i = 1
    • int *const p【指针的值不可变就等价于指针所指的对象不可变】
  • 底层const(Low-Level const):修饰引用和指针类型所绑定的对象类型 , 无法通过引用或指针改变绑定对象的值
    • const int &r = i
    • const int *p = &i

拷贝操作

  • 顶层const不影响拷贝操作

  • 底层const对拷贝操作有限制

    • 两边必须有底层const,右值的非const可以转化为const

    • 两边类型相同时例外,一个const变量显然可以拷贝给一个同类型的非const变量

      • const int i = 1; int j = i;这样的拷贝显然是成立的

2-4 C++ const限定词的更多相关文章

  1. 【C++】const成员函数

    形式: 在成员函数后面加上const限定词,表示不会修改对象内容. 例如Circle类: class Circle { double r; public: Circle(double newr) { ...

  2. C语言全局变量那些事儿

    转自:http://blog.csdn.net/bingqingsuimeng/article/details/9405743 作为一名程序员,如果说沉迷一门编程语言算作一种乐趣的话,那么与此同时反过 ...

  3. C Primer Plus(第五版)12

    第 12 章 存储类, 链接和内存管理 在本章中你将学习下列内容 . 关键字: auto, extern, static, register, const, volatile, restricted. ...

  4. bash内部命令-2

    http://www.gnu.org/software/bash/ http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/ [root@250-shiyan ~]# ...

  5. C Primer Plus之结构和其他数据形式

    声明和初始化结构指针 声明结构化指针,例如: struct guy * him; 初始化结构指针(如果barney是一个guy类型的结构),例如: him = &barney; 注意:和数组不 ...

  6. C primer plus 读书笔记第十四章

    这一章主要介绍C语言的结构和其他数据形式,是学习算法和数据结构的重点. 1.示例代码 /*book.c -- 仅包含一本书的图书目录*/ #include <stdio.h> #defin ...

  7. 【UNIX网络编程(二)】基本TCP套接字编程函数

    基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...

  8. C++要点

           以下的这些要点是对全部的C++程序猿都适用的.我之所以说它们是最重要的,是由于这些要点中提到的是你通常在C++书中或站点上无法找到的.如:指向成员的指针,这是很多资料中都不愿提到的地方, ...

  9. 套接字编程相关函数(2:TCP套接字编程相关函数)

    本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...

  10. <网络编程>基本TCP套接字编程

    tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...

随机推荐

  1. zabbix snmp OID 列表

    系统参数(1.3.6.1.2.1.1) OID 描述 备注 请求方式 .1.3.6.1.2.1.1.1.0 获取系统基本信息 SysDesc GET .1.3.6.1.2.1.1.3.0 监控时间 s ...

  2. 使用 Docker 部署 FRP

    服务端 编写配置文件 vim ~/.config/frp/frps.toml bindPort = 7000 # Web Dashboard [webServer] addr = "0.0. ...

  3. 【Burp Suite】Mac之破解明文密码

    一.安装CA证书 安装证书是为了代理的时候可以继续访问地址,否则的话会提示网络异常 参考文章:<Mac系统Burp Suite的安装>,文章中是火狐浏览器的操作 1.谷歌浏览器 选择导出的 ...

  4. JVM学习笔记之栈区

    JVM学习笔记之栈区 本文主要内容: 栈是什么?栈帧又是什么?在JVM中,main方法调用say方法后,是怎么运行的?本文将详细讲解栈.希望大家学了之后,对栈有更深的了解. 心法:在JVM中,栈管运行 ...

  5. Seata 1.3.0 Oracle 回滚测试验证 报错 ORA-02289: 序列不存在

    使用Seata 1.3.0版本,测试A服务调用B服务,且A方法中,手动写了一个异常,测试是否正常回滚(Mysql已经测试过) 发现报错:ORA-02289: 序列不存在 一看就是undo_log这张表 ...

  6. rabbitmq高可用集群搭建

    需求分析基本情况 在进行RabbitMQ搭建时,我们基于现有的连接数据和业务需求进行了深入分析.目前的统计数据显示,连接数为631,队列数为80418.为了确保业务需求的顺利满足,我们需要在云产品和自 ...

  7. 如何使用ChatGPT自带插件

    OpenAI的插件将ChatGPT连接到第三方应用程序.这些插件使ChatGPT能够与开发者定义的API进行交互,增强ChatGPT的能力,并使其能够执行广泛的操作.插件使ChatGPT能够做如下事情 ...

  8. 15. 三数之和 Golang实现

    给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[i] + nums ...

  9. 平面设计 – 色轮 & 配色

    前言 由于之前那篇有点长, 而且色轮很重要, 所以独立写一篇呗. 参考: 一文看懂色轮 Youtube – 03 色彩 (什么是色相.纯度.明度.色环.补色?怎样配色?) Youtube – 初學繪畫 ...

  10. BOOST 定时器 stop探究

    Asio是一个建立在Boost所提供的相关组件之上的异步的网络库,可以运行在Win/Linux/Unix等各种平台之上. 不过随着C++11的发布,其对Boost的依赖也越来越少,作者又做了一个不依赖 ...