《C++ Primer》第2章 变量(二)
参考资料:
- 《C++ Primer》第5版
- 《C++ Primer 习题集》第5版
2.4 const限定符(P53)
由于 const 对象在创建后不能修改,所以其必须初始化。
const 对象的常量特征仅在执行改变该变量的操作时才会发生作用。
const 对象默认仅在文件内有效。如果想在多个文件之间共享 const 对象,必须在变量定义前加 extern 关键字。
这部分涉及到多文件的内容,待补充!!!
2.4.1 const的引用(P54)
把引用绑定到 const 对象上,称为常量引用:
const int ci = 1;
const int &r = ci;
初始化和对const的引用
初始化常量引用时,可以使用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型:
const int &r1 = 1;double d = 3.14;
const int &r2 = d;
一般的引用要求类型严格一致
为什么常量引用具有上述特殊性呢?实际上,常量引用在绑定时引入了临时量:
const int temp = 1;
const int &r1 = temp;double d = 3.14;
const int temp = d;
const int &r2 = temp;
需要说明的是,当常量引用满足普通引用的条件时,不会引入临时量。不难看出,常量引用在上述情况中实质上是对临时量的引用。这也解释了普通的引用为什么不能通过临时量来实现跨类型引用,因为我们假如通过普通引用修改绑定对象,我们实质上将会修改临时量,而不会修改原来的变量,这显然与我们的初衷相违背,于是 C++ 将这种行为规定为非法行为。
2.4.2 指针和const(P56)
double pi = 3.14;// 常量指针
const double *p = π
// 指针常量
double *const p = *pi;
2.4.3 顶层const(P57)
以指针为例,顶层 const 表示指针本身是常量,底层 const 表示指针所指的对象的是常量。
对顶层 const 执行拷贝操作,没有任何限制:
int i = 1;
int *const p1 = &i;
int *p2 = p1; // 正确
对底层 const 执行拷贝操作,则必须保证拷入对象同时具有底层 const 属性:
int i = 1;
const int *const p1 = &i;
int *p2 = p1; // 错误,因为p2不具备底层const属性
const int *p3 = p1; // 正确
2.4.4 constexpr和常量表达式(P58)
常量表达式指值不会改变且在编译过程中能得到结果的表达式。字面值属于常量表达式,用常量表达式初始化的 const 对象也是常量表达式。
一个对象或表达式是否是常量表达式是由其数据类型和初始值共同决定的:
const int max_file = 20; // 是
const int limit = max_file+1; // 是
int staff_size = 27; // 不是
const int sz = get_size(); // 不是,因为编译时无法计算出结果
constexpr变量
在一个复杂程序中,我们很难分辨一个初始值是否为常量表达式。C++11 规定,可以通过将变量声明为 constexpr 来使编译器进行常量表达式检查。声明为 constexpr 的变量一定是常量,且必须用常量表达式初始化。
字面值类型
能用 constexpr 修饰的类型称为字面值类型,算术类型、引用和指针属于字面值类型,自定义类、IO 库、string 等类型不属于字面值类型。
用 constexpr 修饰的指针必须是 nullptr 或者具有固定地址的对象(定义在函数外的变量、静态变量等)
指针和constexpr
const int *p1 = nullptr; // p1是常量指针
constexpr int *p2 = nullptr; // p2是指针常量
2.5 处理类型(P60)
2.5.1 类型别名(P60)
类型别名和类型等价:
typedef double wages;
typedef wages base, *p; // p是double*的同义词using wages = double; // 新标准
指针、常量和类型别名
typedef char *pstring;
const pstring cstr1 = 0; // cstr1是指针常量
const char *cstr2 = 0; // cstr2是常量指针
个人感觉可以理解为:为复合类型起别名后,用这个别名声明变量时,该复合类型就成了这条声明语句的基本类型。
2.5.2 auto类型说明符(P61)
auto 类型说明符让编译器通过初始值推断变量的类型,因此 auto 定义的变量必须初始化。
由于一条声明语句只能有一个基本数据类型,故语句中所有变量的初始基本数据类型必须一样:
auto x1 = 0, *x2 = &x1; // 正确
auto y1 = 0, y2 = 3.14; // 错误
复合类型、常量和auto
当使用引用变量初始化auto变量时,编译器以被引用对象的类型作为 auto 的类型:
int i = 0, &r = i;
auto a = r; // a为int型变量
auto 一般会忽略顶层 const ,但底层 const 会保留下来:
const int ci = 0, &cr = ci;
auto b = ci; // b为int型变量,ci的顶层const属性被忽略
auto p = &ci; // p为指向const int的指针
如果我们希望 auto 变量是顶层 const ,需要明确指出:
const auto x = ci; // x为const int
还可以将引用的类型设为 auto ,此时的初始化规则同其他引用的初始化规则。
2.5.3 decltype类型指示符(P62)
decltype 的作用是返回操作数的数据类型,编译器分析表达式的类型但并不计算实际的值。与 auto 不同的是,如果 decltype 使用的表达式是一个变量,则 decltype 会返回该变量的类型(包括顶层 const 和引用):
int i = 0, &r = i;
decltype(r) c; // 错误,c为引用类型,必须初始化
引用变量是被引用对象的代名词,只有在
decltype处是例外。
decltype和引用
如果 decltype 使用的是表达式而非变量,则 decltype 返回表达式结果对应的类型:
int i = 0;
decltype(i+1) c; // 正确,c为int型变量
特别地,如果表达式的结果为左值,则
decltype返回引用类型。
如果表达式是解引用操作,则 decltype 将得到引用类型:
int i = 0, *p = &i;
decltype(*p) c; // 错误,c为引用变量
这样的规则是符合逻辑的,因为解引用可以用来操作原变量,所以
decltype的结果应该是引用类型。
如果 decltype 所使用的表达式是变量名加上一对括号,结果将是引用:
decltype((i)) c; // 错误,c为引用变量
这里涉及到“左值”的概念,待补充
2.6 自定义数据结构(P64)
C++ 允许用户以类的形式自定义数据结构。由于类体后面可以紧跟变量名(不推荐这么做),所以类定义后面必须加分号。
类数据成员
C++11 规定,可以为数据成员提供一个类内初始值,在创建对象是,类内初始值将用于初始化数据成员,没有初始值的成员被默认初始化。类内初始值可以放在花括号里、等号右边,不能放在圆括号里。
2.6.3 编写自己的头文件(P67)
类定义通常被定义在头文件中,且该头文件的名字应该和类一样。
头文件可能出现多次包含的情况。
预处理器概述
预处理器是用来确保头文件多次包含仍能安全工作的常用技术。预处理器在编译之前运行。预处理器看到 #include 标记时会用头文件的内容代替 #include 。
头文件保护符依赖于处理变量。预处理变量(NULL 就是一个预处理变量)有两种状态:已定义和未定义。define 指令把把一个名字定义为预处理变量;#ifdef 在变量已定义时为真,#ifndef 在变量未定义时为真,一旦检查结果为真,则执行到 #endif 为止。
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data {\* ... *\};
#endif
如果上述头文件已经被包含,则 ifndef 为假,编译器将忽略 ifndef 到 endif 之间的内容。
相关文章:
《C++ Primer》第2章 变量(二)
参考资料: 《C Primer》第5版《C Primer 习题集》第5版 2.4 const限定符(P53) 由于 const 对象在创建后不能修改,所以其必须初始化。 const 对象的常量特征仅在执行改变该变量的操作时才会发生作用。 const 对象默认仅在文件…...
Vue3统一导出局部组件和全局组件
局部组件统一导出 components新增ComponentA.vue、ComponentB.vue两个组件 新增index.js进行组件统一导入 import ComponentA from ./ComponentA.vue import ComponentB from ./ComponentB.vueexport {ComponentA,ComponentB }使用 <template><ComponentA /><…...
【笔试强训选择题】Day36.习题(错题)解析
作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言一、Day…...
【软考】系统架构设计师 - 知识扩展 - “区块链技术“
目录 一 简介👑 1 比特币❤️ 2 区块链的特点❤️ 3 共识算法❤️ 二 练习题👑 三 扩展👑 1 哈希算法❤️ 2 哈希指针❤️ 3 UTXO❤️ 4 参考资料❤️ 一 简介👑 1 比特币❤️ 比特币底层采用了区块链技术。 比特币交易…...
Pytorch 分布式训练(DP/DDP)
概念 PyTorch是非常流行的深度学习框架,它在主流框架中对于灵活性和易用性的平衡最好。 分布式训练根据并行策略的不同,可以分为模型并行和数据并行。 模型并行 模型并行主要应用于模型相比显存来说更大,一块 GPU 无法加载的场景…...
替换滚珠螺杆需要了解哪些参数?
滚珠螺杆具有定位精度高、高寿命、低污染和可做高速正逆向的传动及变换传动等特性,因具上述特性,滚珠螺杆已成为近来精密科技产业及精密机械产业的定位及测量系统上的重要零组件之一。 众所周知,滚珠螺杆是可以替换的,不仅同品牌之…...
CentOS系统环境搭建(十九)——CentOS7安装chat GPT
centos系统环境搭建专栏🔗点击跳转 CentOS7安装chat GPT Welcome to the AI era! 基于上一篇文章CentOS系统环境搭建(十八)——CentOS7安装Docker20.10.12和docker compose v2,你已经安装了docker20以上的版本。那么࿰…...
【办公类-19-03】办公中的思考——Python批量制作word单元格照片和文字(小照片系列)
背景需求: 工会老师求助:如何在word里面插入4*8的框,我怎么也拉不到4*8大小(她用的是我WORD 文本框) 我一听,这又是要手动反复黏贴“文本框”“照片”“文字”的节奏哦 我问:你要做几个人&…...
【Spring】Spring Bean的4种依赖注入方式
文章目录 前言1. 构造方法注入2. set方法注入3. 自动装配4. 注解 前言 所谓依赖注入,其实就是给对象里的属性赋值,因为对象里有其他对象,因此就形成了依赖。Spring有4种方式来给属性赋值: 构造方法注入set方法注入自动装配注解 …...
overleaf 参考文献引用,创建引用目录.bib文件,在文档中引用参考文献,生成参考文献列表
目录 1 创建一个Overleaf项目 2 导入或创建 .bib 文件 2.1 导入 .bib 文件: 参考文献的 .bib文件获取步骤 (1)打开谷歌学术 (2)输入文献题目 (3)点击引用,然后选择BibTex格式…...
算法通关村第十八关:青铜挑战-回溯是怎么回事
青铜挑战-回溯是怎么回事 回溯,最重要的算法之一 主要解决一些暴力枚举也搞不定的问题,例如组合、分割、子集、排列、棋盘等 从性能角度来看回溯算法的效率并不高,但对于这些暴力都搞不定的算法能出结果就很好了,效率低点没关系…...
【Redis】深入探索 Redis 的数据类型 —— 字符串 string
文章目录 前言一、string 类型的操作命令设置和获取相关命令1. SET 和 GET2. MSET 和 MGET3. SETNX、SETEX、SETPX 计数相关命令1. INCR 和 INCRBY2. DECR 和 DECRBY3. INCRBYFLOAT 字符串操作相关命令1. APPEND2. GETRANGE3. SETRANGE4. STRLEN string 相关命令总结 二、strin…...
Linux操作命令笔记
Linux Linux的字母大小写下载和卸载软件更新查看空间使用情况当前目录所在的位置查看文件中的内容查看目录下的文件重启关机移动文件磁盘管理软件修改权限删除文件或文件夹新建文件夹移动一个文件夹文件重命名编译C和C文件VIM编辑器的相关操作 Linux的字母大小写 Linux的文件以…...
1.8 工程相关解析(各种文件,资源访问
目录 1.8 工程相关解析(各种文件,资源访问) 分类 Android 基础入门教程 本节引言: 1.工程项目结构解析: 1.res资源文件夹介绍: 2.如何去使用这些资源 2.深入了解三个文件: MainActivity.java: 布局…...
unity 前后左右 移动
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { public float moveSpeed 5f; // 移动速度 public float rotateSpeed 180f; // 旋转速度 // Start is called before the firs…...
计算机视觉传统图像处理库opencv的使用
人工智能领域的图像处理分支,整理了计算机视觉传统图像处理库opencv的使用网址链接。 opencv使用范围,主要用在计算机视觉、视频分析、机器学习、医学影像处理、自动驾驶、工业检测、游戏开发上。 1):opencv效果视频 opencv10个应…...
【数据库】通过实例讲清楚,Mongodb的增删查改,分组查询,聚合查询aggregate
目录 一.基础概念 二.数据库的管理 1.创建数据库 2.删除数据库 二.集合的管理 1.显示所有集合 2.创建集合 3.删除当前集合 4.向集合中插入元素 三.文档的管理 1.文档插入 2.文档的更新 3.文档的删除 4.文档查询 (1)查询基本语法࿱…...
vue + video.js 加载多种视频流(HLS、FLV、RTMP、RTSP)
起因: 由于需要在一个项目内接入多种常用的视频流,所以接触到video.js,这里就做个记录。 框架: vue2 video.js videojs-contrib-hls videojs-flvjs-es6 videojs-flash video-js.swf vue安装就不讲了,直接从项目…...
用 Python 微调 ChatGPT (GPT-3.5 Turbo)
用 Python 微调 ChatGPT (GPT-3.5 Turbo) 备受期待的 GPT-3.5 Turbo 微调功能现已推出,并且为今年秋季即将发布的 GPT-4 微调功能奠定了基础。 这不仅仅是一次简单的更新——它是一个游戏规则改变者,为开发人员提供了完美定制人工智能模型的关键解决方案…...
单目标应用:基于蜘蛛蜂优化算法(Spider wasp optimizer,SWO)的微电网优化调度MATLAB
一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、蜘蛛蜂优化算法 蜘蛛蜂优化算法(Spider wasp optimizer,SWO)由Mohamed Abdel-Basset等人于2023年提出,该…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
