2-4 C++ const限定词
建议直接看总结和比较,如有需要再看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文件时也要extern:extern 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 = π
*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 = π
p = &f; //error:无法修改p的指向对象
return 0;
}
变量定义的读法:从左往右
const double *const pip = π
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 = 1int *const p【指针的值不可变就等价于指针所指的对象不可变】
- 底层const(Low-Level const):修饰引用和指针类型所绑定的对象类型 , 无法通过引用或指针改变绑定对象的值
const int &r = iconst int *p = &i
拷贝操作


顶层const不影响拷贝操作

底层const对拷贝操作有限制
两边必须有底层const,右值的非const可以转化为const

两边类型相同时例外,一个const变量显然可以拷贝给一个同类型的非const变量
const int i = 1; int j = i;这样的拷贝显然是成立的
2-4 C++ const限定词的更多相关文章
- 【C++】const成员函数
形式: 在成员函数后面加上const限定词,表示不会修改对象内容. 例如Circle类: class Circle { double r; public: Circle(double newr) { ...
- C语言全局变量那些事儿
转自:http://blog.csdn.net/bingqingsuimeng/article/details/9405743 作为一名程序员,如果说沉迷一门编程语言算作一种乐趣的话,那么与此同时反过 ...
- C Primer Plus(第五版)12
第 12 章 存储类, 链接和内存管理 在本章中你将学习下列内容 . 关键字: auto, extern, static, register, const, volatile, restricted. ...
- bash内部命令-2
http://www.gnu.org/software/bash/ http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/ [root@250-shiyan ~]# ...
- C Primer Plus之结构和其他数据形式
声明和初始化结构指针 声明结构化指针,例如: struct guy * him; 初始化结构指针(如果barney是一个guy类型的结构),例如: him = &barney; 注意:和数组不 ...
- C primer plus 读书笔记第十四章
这一章主要介绍C语言的结构和其他数据形式,是学习算法和数据结构的重点. 1.示例代码 /*book.c -- 仅包含一本书的图书目录*/ #include <stdio.h> #defin ...
- 【UNIX网络编程(二)】基本TCP套接字编程函数
基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...
- C++要点
以下的这些要点是对全部的C++程序猿都适用的.我之所以说它们是最重要的,是由于这些要点中提到的是你通常在C++书中或站点上无法找到的.如:指向成员的指针,这是很多资料中都不愿提到的地方, ...
- 套接字编程相关函数(2:TCP套接字编程相关函数)
本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...
- <网络编程>基本TCP套接字编程
tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...
随机推荐
- 使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验
前言 当前.NET环境下,生成WebApi代理类的工具已经有很多选择了,比如OpenApi Generator,NSwag和Refitter等,不同的工具生成的代码风格以及实现方式略有不同,比如Ref ...
- 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)
从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章) 1.简介 该项目整合了编程.AI.产品设计.商业科技及个人成长等多领域的精华内容,源自顶 ...
- 1055 - Expression #9 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx.xxx.xxx' which is not functionally ...;this is incompatible with sql_mode=only_full_group_by
MySQL 8 的默认 sql_mode 包含了only_full_group_by,如果想要sql不按照这模式做检查,可以设置当前session的sql_mode值不包含oly_full_group ...
- 【解决方案】项目重构之如何使用 MySQL 替换原来的 MongoDB
目录 前言 一.痛点所在 二.选型分析 2.1特点对比 2.2场景对比 三.核心思路 四.demo 示例 4.1实体映射 4.1.1MongoDB 实体 4.1.2MySQL 实体 4.2查询代码 4 ...
- Falcon Mamba: 首个高效的无注意力机制 7B 模型
Falcon Mamba 是由阿布扎比的 Technology Innovation Institute (TII) 开发并基于 TII Falcon Mamba 7B License 1.0 的开放 ...
- Ubuntu18.04未发现WiFi适配器情况解决方案之一
问题: 第一次你可能会遇见这种情况,ubuntu未发现Wifi适配器解决方案 无法打开WIfi 并告诉你没有WiFi适配器 解决方案: 解决方案如下: sudo modprobe -r ideapa ...
- A4纸尺寸
A4纸尺寸 A4纸尺寸:210×297: A3纸尺寸:297×420: A2纸尺寸:420×594: A1纸尺寸:594×841: A0纸尺寸:841×1189: 备注:长(mm)×宽(mm) 单位: ...
- GRLSTM: 基于图的残差LSTM轨迹相似性计算《GRLSTM: Trajectory Similarity Computation with Graph-Based Residual LSTM》(轨迹路网融合、知识图谱嵌入、图神经网络、残差网络、点融合图、多头图注意力网络GAT、残差LSTM、点感知损失函数(图的点损失函数、轨迹的点损失函数))
2023年10月18日,14:14. 来不及了,这一篇还是看的翻译. 论文:GRLSTM: Trajectory Similarity Computation with Graph-Based Res ...
- 大一下的acm生活
在一个名气不大的211学校刷题的日常. 感觉这些算法题好难啊! 最近有好多实验室要招新,不知道该怎么办,自己只想就业,并不想升学,好烦! 真枯燥,好无聊. 现在要学习相关的网页设计和网站建设,例如配色 ...
- K8S基本组件梳理
Master组件 apiserver:对资源对象进行curd操作,例如pod和server:将所有的状态储存到etcd中. schedule:监控未调度的pod,根据pod的资源需求.资源可用性和其他 ...
