当前位置: 首页 > news >正文

《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 为假,编译器将忽略 ifndefendif 之间的内容。

相关文章:

《C++ Primer》第2章 变量(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 2.4 const限定符&#xff08;P53&#xff09; 由于 const 对象在创建后不能修改&#xff0c;所以其必须初始化。 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.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言一、Day…...

【软考】系统架构设计师 - 知识扩展 - “区块链技术“

目录 一 简介&#x1f451; 1 比特币❤️ 2 区块链的特点❤️ 3 共识算法❤️ 二 练习题&#x1f451; 三 扩展&#x1f451; 1 哈希算法❤️ 2 哈希指针❤️ 3 UTXO❤️ 4 参考资料❤️ 一 简介&#x1f451; 1 比特币❤️ 比特币底层采用了区块链技术。 比特币交易…...

Pytorch 分布式训练(DP/DDP)

概念 PyTorch是非常流行的深度学习框架&#xff0c;它在主流框架中对于灵活性和易用性的平衡最好。 分布式训练根据并行策略的不同&#xff0c;可以分为模型并行和数据并行。 模型并行 模型并行主要应用于模型相比显存来说更大&#xff0c;一块 GPU 无法加载的场景&#xf…...

替换滚珠螺杆需要了解哪些参数?

滚珠螺杆具有定位精度高、高寿命、低污染和可做高速正逆向的传动及变换传动等特性&#xff0c;因具上述特性&#xff0c;滚珠螺杆已成为近来精密科技产业及精密机械产业的定位及测量系统上的重要零组件之一。 众所周知&#xff0c;滚珠螺杆是可以替换的&#xff0c;不仅同品牌之…...

CentOS系统环境搭建(十九)——CentOS7安装chat GPT

centos系统环境搭建专栏&#x1f517;点击跳转 CentOS7安装chat GPT Welcome to the AI era! 基于上一篇文章CentOS系统环境搭建&#xff08;十八&#xff09;——CentOS7安装Docker20.10.12和docker compose v2&#xff0c;你已经安装了docker20以上的版本。那么&#xff0…...

【办公类-19-03】办公中的思考——Python批量制作word单元格照片和文字(小照片系列)

背景需求&#xff1a; 工会老师求助&#xff1a;如何在word里面插入4*8的框&#xff0c;我怎么也拉不到4*8大小&#xff08;她用的是我WORD 文本框&#xff09; 我一听&#xff0c;这又是要手动反复黏贴“文本框”“照片”“文字”的节奏哦 我问&#xff1a;你要做几个人&…...

【Spring】Spring Bean的4种依赖注入方式

文章目录 前言1. 构造方法注入2. set方法注入3. 自动装配4. 注解 前言 所谓依赖注入&#xff0c;其实就是给对象里的属性赋值&#xff0c;因为对象里有其他对象&#xff0c;因此就形成了依赖。Spring有4种方式来给属性赋值&#xff1a; 构造方法注入set方法注入自动装配注解 …...

overleaf 参考文献引用,创建引用目录.bib文件,在文档中引用参考文献,生成参考文献列表

目录 1 创建一个Overleaf项目 2 导入或创建 .bib 文件 2.1 导入 .bib 文件&#xff1a; 参考文献的 .bib文件获取步骤 &#xff08;1&#xff09;打开谷歌学术 &#xff08;2&#xff09;输入文献题目 &#xff08;3&#xff09;点击引用&#xff0c;然后选择BibTex格式…...

算法通关村第十八关:青铜挑战-回溯是怎么回事

青铜挑战-回溯是怎么回事 回溯&#xff0c;最重要的算法之一 主要解决一些暴力枚举也搞不定的问题&#xff0c;例如组合、分割、子集、排列、棋盘等 从性能角度来看回溯算法的效率并不高&#xff0c;但对于这些暴力都搞不定的算法能出结果就很好了&#xff0c;效率低点没关系…...

【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 工程相关解析(各种文件&#xff0c;资源访问) 分类 Android 基础入门教程 本节引言&#xff1a; 1.工程项目结构解析&#xff1a; 1.res资源文件夹介绍&#xff1a; 2.如何去使用这些资源 2.深入了解三个文件&#xff1a; MainActivity.java&#xff1a; 布局…...

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的使用

人工智能领域的图像处理分支&#xff0c;整理了计算机视觉传统图像处理库opencv的使用网址链接。 opencv使用范围&#xff0c;主要用在计算机视觉、视频分析、机器学习、医学影像处理、自动驾驶、工业检测、游戏开发上。 1&#xff09;&#xff1a;opencv效果视频 opencv10个应…...

【数据库】通过实例讲清楚,Mongodb的增删查改,分组查询,聚合查询aggregate

目录 一.基础概念 二.数据库的管理 1.创建数据库 2.删除数据库 二.集合的管理 1.显示所有集合 2.创建集合 3.删除当前集合 4.向集合中插入元素 三.文档的管理 1.文档插入 2.文档的更新 3.文档的删除 4.文档查询 &#xff08;1&#xff09;查询基本语法&#xff1…...

vue + video.js 加载多种视频流(HLS、FLV、RTMP、RTSP)

起因&#xff1a; 由于需要在一个项目内接入多种常用的视频流&#xff0c;所以接触到video.js&#xff0c;这里就做个记录。 框架&#xff1a; vue2 video.js videojs-contrib-hls videojs-flvjs-es6 videojs-flash video-js.swf vue安装就不讲了&#xff0c;直接从项目…...

用 Python 微调 ChatGPT (GPT-3.5 Turbo)

用 Python 微调 ChatGPT (GPT-3.5 Turbo) 备受期待的 GPT-3.5 Turbo 微调功能现已推出&#xff0c;并且为今年秋季即将发布的 GPT-4 微调功能奠定了基础。 这不仅仅是一次简单的更新——它是一个游戏规则改变者&#xff0c;为开发人员提供了完美定制人工智能模型的关键解决方案…...

单目标应用:基于蜘蛛蜂优化算法(Spider wasp optimizer,SWO)的微电网优化调度MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、蜘蛛蜂优化算法 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该…...

2023年7月京东饮料行业数据分析(京东运营数据分析)

饮料消费已成为当下快消品行业里的主力军&#xff0c;随着社会群体喜好的改变、消费群体的不断扩大&#xff0c;可选择的饮料种类越来越多&#xff0c;我国饮料市场的体量也较为庞大。根据鲸参谋电商数据分析平台的数据显示&#xff0c;今年7月份&#xff0c;京东平台饮料的销量…...

执行 JUnit 单元测试前,修改环境变量

同一份代码&#xff0c;在不改变配置文件的情况下&#xff0c;可以连接不同的数据库&#xff0c;进行JUnit测试。 非开发、测试、生产环境的区别。而是 我就站在这里&#xff0c;指哪打哪&#xff01; 避免重复造轮子&#xff0c;参考博文&#xff1a; 使用junit&spri…...

openGauss学习笔记-63 openGauss 数据库管理-资源池化架构

文章目录 openGauss学习笔记-63 openGauss 数据库管理-资源池化架构 openGauss学习笔记-63 openGauss 数据库管理-资源池化架构 本文档主要介绍资源池化架构下的一些最佳实践和使用注意事项&#xff0c;用于支撑对相关特性感兴趣的开发者可以快速部署、实践或进行定制化开发。…...

计算机竞赛 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的植物识别算法 ** …...

ChatGPT如何应对紧急情况和灾害应对?

ChatGPT是一个文本生成模型&#xff0c;它可以用于各种任务&#xff0c;但在处理紧急情况和灾害应对方面&#xff0c;它有一些潜在的用途和限制。在这篇文章中&#xff0c;我们将讨论ChatGPT在紧急情况和灾害应对中的应用&#xff0c;以及如何充分利用这一技术&#xff0c;并提…...

ElementUI浅尝辄止37:Select 选择器

当选项过多时&#xff0c;使用下拉菜单展示并选择内容。 1.如何使用&#xff1f;基础单选 v-model的值为当前被选中的el-option的 value 属性值 <template><el-select v-model"value" placeholder"请选择"><el-optionv-for"item in …...

PCL 基于任意四点计算球心坐标

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 继续基于之前的思路PCL 基于三个点计算圆心坐标之二(二维),假设存在四个不共面的点, ( x 1 , y 1 ) (x_1,y_1)...

飞书即时消息无需API开发连接Cohere,打造飞书AI智能问答助手

飞书即时消息用户使用场景&#xff1a; 许多企业都在使用飞书系统进行协同办公&#xff0c;而现在有了Cohere大语言模型技术&#xff0c;能够根据用户的提问来自动产生回答&#xff0c;无需人为干预。对于企业负责人来说&#xff0c;他们认为如果将Cohere技术融入到飞书机器人中…...

FPGA实现Cordic算法——向量模式

FPGA实现Cordic算法——向量模式 FPGA实现Cordic算法——向量模式1.cordic算法基本原理2.FPGA实现cordic算法向量模式i、FPGA串行实现cordicii、FPGA流水线实现cordiciii、实验结果 FPGA实现Cordic算法——向量模式 1.cordic算法基本原理 FPGA中运算三角函数&#xff0c;浮点数…...

【常用代码14】el-input输入框内判断正则,只能输入数字,过滤汉字+字母。

问题描述&#xff1a; el-input输入框&#xff0c;只能输入数字&#xff0c;但是不能显示输入框最右边的上下箭头&#xff0c; <el-input v-model"input" type"number" placeholder"请输入内容" style"width: 200px;margin: 50px 0;&…...