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

跟CZY一起深入理解C++(1)-一些基础知识

跟CZY一起深入理解C++些基础知识

  • 常量
    • const
    • constexpr
  • 初始化
  • 枚举与枚举类
  • 分离编译

常量

const

常量亦即不可改变的量(实际上可以暴力破解),那么常量在C++中主要有以下几种应用场景

  • 定义常量变量
//如果有以下情况,在GCC上能够破解,而在MSVC上不会改变
// int放在栈区,实际上是可以修改的,const是一种用户层的限制
const int  CN = 300;
int* b = const_cast<int*>(&CN);
*b = 100;
static const int CN = 100;
//如果有以下情况,会直接导致coredump,无论在MSVC还是GCC上结果都一致
//原因在于static const 在静态常量区,这个区是无论如何也不能被修改的,修改会直接导致coredump的发生
int* b = const_cast<int*>(&CN);
*b = 100;
  • 定义常量指针
///const 修饰指针的指向,指针可变,指针指向的对象不可变
const int* ptrToConst = &myConstVar;
  • 定义指针常量
///const修饰指针,指针不可变,指针指向的对象可变
int* const constPtr = &myVar;
  • 定义常量引用
/// 由于引用本身就是不可改变所引用的对象的
///故常量引用是指引用所指的对象不可变
const int& constRef = myVar;
  • 常量成员函数
class MyClass {
public:void regularFunction() {// 可以修改成员变量myVar = 10;}void constFunction() const {// 不能修改成员变量,只能读取///	这里刚好介绍一下mutable的相关知识/// 若myVar前面加上了mutable关键字,那么在常量成员函数中可以修改///最常见的场景就是常量成员函数需要加锁的情况,互斥量在加锁过程中是///需要修改的,所以要用mutable修饰互斥量使得常量成员函数中也能加上锁int x = myVar;}
private:int myVar;
};
  • 对函数参数进行修饰
void func(const a,const b){
///对参数的修饰见上文,语义是一致的	
}

constexpr

有了const为什么还需要constexpr呢,constexpr代表的其实是一种期望语义,告诉编译器该值有可能在编译期间算出来,那么编译器就会尽可能的在编译期算出来,见下面的例子

constexpr int getArrSize(int a,int b){return a + b;
}constexpr int A = 30;
constexpr int B = 30;
int main()
{constexpr int arrSize  = getArrSize(A,B);///这里arrSize的值能够在编译器确定,因此可以申明这样的数组///而如果getArrSize的返回值不用constexpr申明,那么将不再通过编译int arr[arrSize];std::cout << sizeof(arr)/sizeof(int) << std::endl;getchar();return 0;
}

总结:constexpr提高了C++在编译时的计算能力,并且能用更加简洁的方式进行模板元编程,测验,constexpr到底在哪个区呢,实际上constexpr的内存区域存储位置取决于其声明的位置

初始化

等值初始化和花括号初始化都是常见的初始化形式
更加推荐{}初始化,理由有以下几点,

  • 传统的初始化(=初始化),会尝试隐式转换.这可能造成精度丢失等问题
int a = 3.7;//ok
int a{3.7};//compiler error
  • 可读性更好

但要注意转化成initial_list的问题

枚举与枚举类

更加推荐使用枚举类
假设存在下面场景

enum class Color{Red = 0;Black = 1;
};
enum class TraficLight{Red = 1;Green = 0;
};

如果不用enum class 那么就会上报一个Red重定义的错误,而且enum class 也避免了如下的情况发生

Color = TraficLight::Red;//error
int c = Color::Red;///error

这避免了很多程序中潜在的错误,你可以为枚举类定义运算符,例如

enum class Light {Red = 2,Black
};
Light& operator++(Light& t){switch(t){case(Light::Red):{t = Light::Black;return t;}}return t;
}

分离编译

c++支持分离编译的概念,用户代码只看见类型和函数声明,定义被放在分离的源文件中,被分别编译,将编译时间降低到最少,一个库可以理解成一组分离编译的代码的集合
在这里插入图片描述
如上图所示,user.cpp和Vector.cpp共享Vector.h的接口,但是编译的过程是分离开来的

相关文章:

跟CZY一起深入理解C++(1)-一些基础知识

跟CZY一起深入理解C些基础知识 常量constconstexpr 初始化枚举与枚举类分离编译 常量 const 常量亦即不可改变的量(实际上可以暴力破解),那么常量在C中主要有以下几种应用场景 定义常量变量 //如果有以下情况,在GCC上能够破解,而在MSVC上不会改变 // int放在栈区,实际上是可…...

bash变量和参数介绍

bash变量和参数介绍 概述 变量可以让程序和脚本语言用来描述数据。一个变量仅仅是一个标签而已&#xff0c;被指定到计算机内存中存储着数据的某个位置或某些位置的标签。变量一般出现在算术运算操作和数量操纵及字符串解析中。 4.1. 变量替换(Variable Substitution) 变量的名…...

Qt 信号与槽

信号与槽&#xff08;signal & slot&#xff09;是Qt编程的基础&#xff0c;使Qt中处理界面各个组件的交互操作变得更加直观和简单。 信号&#xff08;Signal&#xff09;就是在特定情况下被发射的事件&#xff0c;如PushButton最常见的信号就是鼠标单击时发射的clicked()…...

目标检测与跟踪 (1)- 机器人视觉与YOLO V8

目录 1、研究背景 2. 算法原理及对比 2.1 点对特征&#xff08;Point Pairs&#xff09; 2.2 模板匹配 2.3 霍夫森林 2.4 深度学习 3、YOLO家族模型演变 4、YOLO V8 1、研究背景 机器人视觉识别技术是移动机器人平台十分关键的技术&#xff0c;代表着机器人智能化、自动化…...

mlr3verse vs KM曲线:谁能更精准地预测生存率?

一、引言 生存分析是统计学中一种重要的方法&#xff0c;用于分析个体在特定时间段内生存的概率或生存率。它在医学、流行病学、生物学等领域被广泛应用。通过生存分析&#xff0c;我们可以评估治疗方法的效果、预测疾病进展的风险以及评估特定因素对生存率的影响。 生存率的准…...

TechTool Pro for mac(硬件监测和系统维护工具)

TechTool Pro 是为 Mac OS X 重新设计的全新工具程序&#xff0c;不但保留旧版原有的硬件侦测功能&#xff0c;还可检查系统上其他重要功能&#xff0c;如&#xff1a;网络连接&#xff0c;区域网络等。 TechTool Pro for mac随时监控和保护您的电脑&#xff0c;并可预设定期检…...

排序算法(九大)- C++实现

目录 基数排序 快速排序 Hoare版本&#xff08;单趟&#xff09; 快速排序优化 三数取中 小区间优化 挖坑法&#xff08;单趟&#xff09; 前后指针法&#xff08;单趟&#xff09; 非递归实现&#xff08;快排&#xff09; 归并排序 非递归实现&#xff08;归并&am…...

lettuce连接池的源代码(link)

springboot研究九&#xff1a;lettuce连接池很香&#xff0c;撸撸它的源代码_lettuce springboot_君哥聊技术的博客-CSDN博客...

小白到运维工程师自学之路 第六十二集 (docker持久化与数据卷容器)

一、概述 Docker持久化是指将容器中的数据持久保存在主机上&#xff0c;以便在容器重新启动或迁移时不丢失数据。由于Docker容器是临时和可变的&#xff0c;它们的文件系统默认是易失的&#xff0c;这意味着容器中的任何更改或创建的文件都只存在于此容器的生命周期内。但是&a…...

37.利用linprog解 有约束条件多元变量函数最小值(matlab程序)

1.简述 linprog函数主要用来求线型规划中的最小值问题&#xff08;最大值的镜像问题&#xff0c;求最大值只需要加个“-”&#xff09; 2. 算法结构及使用方法 针对约束条件为Axb或Ax≤b的问题 2.1 linprog函数 xlinprog(f,A,b) xlinprog(f,A,b,Aeq,beq) xlinprog(f,A,b,Aeq,…...

分页Demo

目录 一、分页对象封装 分页数据对象 分页查询实体类 实体类用到的utils ServiceException StringUtils SqlUtil BaseMapperPlus,> BeanCopyUtils 二、示例 controller service dao 一、分页对象封装 分页数据对象 import cn.hutool.http.HttpStatus; import com.…...

ChatGPT超详细介绍与功能与免费网页版(超全面!)

ChatGPT ChatGPT前言ChatGPT介绍ChatGPT的优点关于ChatGPT的一些问题1.chatgpt是什么意思?2.chatgpt国内能用吗? 国内可用的ChatGPT网页版&#xff1a;1.ChatGPT prompts2.这个网站收集了5000多个ChatGPT 应用&#xff0c;可以在线运行3.ChatGPT Box4.飞书chatgpt5.AI-Produc…...

3.PyCharm安装

PyCharm是由JetBrains推出的Python开发IDE,是最受欢迎的Python IDE之一。PyCharm为Python开发者提供了许多高级功能如代码自动完成、调试等。它使用智能引擎来分析代码,能够自动识别代码中的错误并提供快速修复方案。PyCharm适用于各种规模的项目,包括小型Python脚本和大型P…...

【C语言进阶篇】关于指针的八个经典笔试题(图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 指针笔试题&#x1f4ad; 笔试题 1&#xff1a;✅ 代码解析⁉️ 检验结果&…...

用Rust实现23种设计模式之 策略模式

关注我&#xff0c;学习Rust不迷路&#xff01;&#xff01; 优点 灵活性&#xff1a;策略模式允许你在运行时动态地选择不同的算法或行为&#xff0c;而无需修改已有的代码。可扩展性&#xff1a;通过添加新的策略类&#xff0c;你可以轻松地扩展策略模式的功能。可维护性&a…...

面试题:说说JS的this指向问题?

1、this永远指向一个对象&#xff1b; 2、this的指向完全取决于函数调用的位置&#xff1b; 可以借鉴这篇文章&#xff0c;说的很详细&#xff08;点击&#xff09; 总结&#xff1a; 1、 以方法的形式调用时&#xff0c; this 是调用方法的对象&#xff1b; 2、绑定事件函…...

ansible——roles 角色

一、概述 1.roles角色简介 roles用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。 简单来讲&#xff0c;roles就是通过分别将变量、文件、任务、模板及处理器放置…...

GitHub上删除项目后,IDEA分享项目到GitHub提示Remote is already on GitHub

文章目录 一、错误信息二、解决方法1.删除GitHub上的项目2.找到项目里的.git隐藏文件3.找到config文件4.打开config文件&#xff0c;删除[remote "git-test"]及下面两行内容5.继续使用IDEA分享项目到GitHub即可 一、错误信息 二、解决方法 1.删除GitHub上的项目 2.…...

【机器学习 | 决策树】利用数据的潜力:用决策树解锁洞察力

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…...

postgis mvt矢量切片 django drf mapboxgl

postgis mvt矢量切片 django drf mapboxgl 目录 0.前提 1.sql代码 2.django drf后端服务代码 3.具体的应用&#xff08;整体代码&#xff09; 4.参考 0.前提 [1] 静态的矢量切片可以采用 tippecanoe 生成&#xff0c;nginx代理&#xff0c;这种数据是不更新的&#xff1b…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...