C/C++关键字大全
目录
一、const
二、static
三、#define 和 typedef
四、#define 和 inline
五、#define 和 const
六、new 和 malloc
七、const 和 constexpr
八、volatile
九、extern
十、前置 ++ 和后置 ++
十一、atomic
十二、struct 和 class
一、const
1、const
关键字可用于定义常量,一旦被赋值,其值在程序运行期间就不能被修改。
const int num = 10; // 定义一个常量 num,值为 10
2、const 用来修饰指针时,有两种用法:
(1)const 数据类型 *指针变量 = 变量名 or 数据类型 const *指针变量 = 变量名
当const在*前时,指的是不能通过这个指针变量来修改其指向的值,而指针本身可被修改
int temp = 10, b = 1; const int* a = &temp; int const *a = &temp; // 更改: *a = 9; // 错误:只读对象 temp = 9; // 正确 a = &b; //正确
(2)数据类型 * const 指针变量 = 变量名
当const在*后时,指的是指针本身不可被修改,但可以通过指针修改其指向的值
int temp = 10; int temp1 = 12; int* const p = &temp; // 更改: p = &temp2; // 错误 *p = 9; // 正确
3、const 可用来修饰引用,表示不能通过该引用修改变量
int temp = 10;
const int& t = temp;
temp = 9; // 正确
t = 9; //错误
其中,const权限只可降级,即非const引用或非const值可以初始化const引用,而反过来不行
int temp1 = 10;
const int temp2 = 5;
int& a = temp1;
const int& b = a; //正确
int& c = b; //错误,const权限不可升级
int& d = temp2; //错误,const权限不可升级
4、const修饰成员函数和实例对象
- 当一个成员函数被 const 修饰时,它表明这个函数不会修改类的成员变量,但可以修改类的静态成员变量,因为静态成员变量不属于对象本身,而是属于整个类的,是所有对象共享一个的。
- 当一个对象被 const 修饰后,意味着这个对象在生命周期内的成员属性不可改变,故该对象只能调用 const 成员函数。
#include <iostream>class MyClass {
private:int nonStaticValue;
public:static int staticValue;MyClass(int v) : nonStaticValue(v) {}int getNonStaticValue() const { // const 成员函数return nonStaticValue;}void modifyStaticValue(int v) const { // const 成员函数修改静态成员变量staticValue = v;}
};int MyClass::staticValue = 0; // 静态成员变量初始化int main() {const MyClass obj(10); // 创建 const 对象std::cout << obj.getNonStaticValue() << std::endl; // 可以调用 const 成员函数获取非静态成员变量的值obj.modifyStaticValue(20); // const 成员函数可以修改静态成员变量std::cout << MyClass::staticValue << std::endl; // 输出修改后的静态成员变量的值return 0;
}
二、static
1、在函数内部,static
修饰的变量其生存期贯穿整个程序运行期间,但作用域仍在函数内部。
void func() {static int count = 0; // 每次调用 func 函数,count 的值都会保留count++;
}
2、在类中,static
成员变量属于整个类,而非某个对象。
class MyClass {
public:static int staticVar;
};int MyClass::staticVar = 0;
3、如果static修饰了全局变量,生命周期不变,还是全局,但是作用域降为了本文件有效;修饰全局函数是同样的道理
#include <iostream>// 定义全局变量
static int globalStaticVar = 10; // 使用 static 修饰的全局变量void function() {std::cout << "globalStaticVar in function: " << globalStaticVar << std::endl;
}int main() {std::cout << "globalStaticVar in main: " << globalStaticVar << std::endl;function();// 错误:在其他文件中无法访问这个 static 修饰的全局变量// extern int globalStaticVar; return 0;
}
4、static修饰成员函数,不与特定的对象相关联,可以通过类名和作用域解析运算符直接调用,虽然仍然可以使用实例化对象调用静态成员函数,但在实际编程中不推荐这样的写法,因为静态成员函数不依赖于具体的对象实例,它是属于整个类的。通常更推荐使用类名直接来调用静态成员函数,如下所示:
MyClass::staticMethod();
三、#define
和 typedef
在 C 和 C++ 中,#define 和 typedef 都可以用于给类型取别名,但它们之间存在一些重要的区别。
1、语法和实现机制
#define
是预处理器指令,通过简单的文本替换来实现别名定义。#define INT_PTR int*
typedef
则是在编译阶段起作用的关键字。typedef int* IntPtr;
2、作用域
#define
不受作用域限制,在预处理器阶段进行替换,全局有效typedef
遵循作用域规则,在其定义的作用域内有效。3、类型检查
#define
只是简单的文本替换,没有类型检查。typedef
是类型定义,具有类型检查。4、复杂类型处理
- 对于复杂的类型,如指针、数组等,
typedef
更清晰和直观。例如,对于指向函数的指针,使用typedef
更易理解。typedef int (*FuncPtr)(int);
#define
在处理复杂类型时可能会导致混淆和错误。5、可移植性
typedef
的行为在不同的编译器中通常更一致,具有更好的可移植性。
总的来说,虽然 #define
和 typedef
都能给类型取别名,但在大多数情况下,特别是对于复杂类型和需要类型检查及良好可移植性的场景,typedef
是更推荐的选择。
四、#define
和 inline
在 C/C++ 中,inline
函数和宏函数都有在代码中进行内联展开以提高性能的作用,但它们之间存在一些显著的区别。
1、语法和定义方式
inline
函数是使用inline
关键字修饰的正常函数。inline int add(int a, int b) {return a + b; }
- 宏函数则是通过
#define
宏定义来实现的,只是在预处理阶段简单的文本替换#define ADD(a, b) ((a) + (b))
2、类型检查
inline
函数具有严格的类型检查,参数类型必须匹配。- 宏函数只是简单的文本替换,不进行类型检查,可能会导致潜在的类型错误。
3、参数处理
inline
函数对参数的处理是按照函数的参数传递规则进行的。- 宏函数如果定义不当可能会出现不符合预期的情况,例如:
#define SQUARE(x) (x * x) int a = 2 + 3; int b = SQUARE(a); // 会被替换为 (2 + 3) * 2 + 3),结果不符合预期//正确定义: #define SQUARE(x) ((x) * (x))
4、调试
inline
函数可以像普通函数一样进行调试,可以设置断点、查看调用栈等。- 宏函数在调试时可能会带来困难,因为它们在预处理阶段就被替换了。
5、代码可读性
inline
函数的定义方式更符合函数的常规语法,代码可读性更好。- 宏函数的定义可能会使代码看起来比较复杂,可读性较差。
在大多数情况下,inline
函数由于具有更好的类型安全性、可读性和调试性,是更优的选择。然而,在一些简单且性能关键的场景中,宏函数可能仍然有用。最后一点就是,inline只是对编译器的建议,具体做不做内联,要看编译器的选择。
五、#define
和 const
const和#dfine都可以用来定义常量,#define只是对字面量的文本替换,没有类型检查,预处理器在替换时也不会考虑作用域;const定义的常量是在编译时要进行类型检查的
#define PI 3.14159
const double Pi = 3.14159;
六、new
和 malloc
1、new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。
2、使⽤new操作符申请内存分配时⽆须指定内存块的⼤⼩,⽽malloc则需要显式地指出所需内存的尺⼨。
3、opeartor new /operator delete可以被重载,⽽malloc/free并不允许重载。
4、new/delete会调⽤对象的构造函数/析构函数以完成对象的构造/析构。⽽malloc/free则不会
5、malloc与free是C++/C语⾔的标准库函数,new/delete是C++的运算符
6、new会返回申请类型的指针,malloc是返回void*指针,需要强制转换
七、const
和 constexpr
const
和 constexpr
都用于定义常量,const
的值可以在运行时确定,而 constexpr
的值必须在编译时确定。constexpr
对值的确定时间有更严格的要求,并且在一些特定的场景中能提供更好的性能和代码可读性。
八、volatile
volatile
用于告诉编译器,该变量的值可能会被意外地改变,不要进行 volatile修饰的变量,旨在告诉编译器,关闭对这个变量的编译优化,当需要对改变了进行读写和运算时,必须从内存重新装载内容,而不允许读取寄存器中的缓存。
九、extern
extern
用于声明一个在其他文件中定义的全局变量或函数。
十、前置 ++
和后置 ++
前置++返回已经修改过的对象本身,而后置++返回被修改之前的临时对象,所以后置++的表达式不能作为左值,但前置++可以
int num = 6;
int preIncrement = ++num; // 返回7
int postIncrement = num++; // 返回 6
十一、atomic
atomic
用于实现原子操作,确保在多线程环境中的操作是原子性的,不会被其他线程打断。
-
定义
atomic
通常用于多线程编程中,用于确保对特定类型的操作是原子性的。
-
用途
- 保证操作的原子性:在多线程环境下,原子操作可以避免数据竞争和不一致性。例如,对一个整数的递增或读取操作,如果使用
atomic
类型包装,就能保证在多线程并发访问时不会出现中间状态的错误。
- 保证操作的原子性:在多线程环境下,原子操作可以避免数据竞争和不一致性。例如,对一个整数的递增或读取操作,如果使用
-
示例
#include <atomic>// 定义一个原子整数 std::atomic<int> atomicVar(0); //C++17支持"="初始化void threadFunction() {atomicVar++; // 原子性的递增操作 }int main() {// 创建多个线程执行 threadFunctionreturn 0; }
-
注意事项
- 并非所有的操作都能被原子化,具体取决于所使用的原子类型和编译器的支持。
- 使用
atomic
虽然能保证原子性,但可能会带来一定的性能开销。
总之,atomic
是多线程编程中的重要工具,能有效地提高程序在多线程环境下的正确性和稳定性,但需要在性能和正确性之间进行权衡。
十二、struct
和 class
在 C 语言中,struct
主要用于简单地将不同类型的数据组合在一起,形成一个新的数据类型。其成员均为公开的,并且 struct
本身无法包含成员函数,仅仅是纯粹的数据组合。
在 C++ 中,struct
得到了显著的提升,实际上被视为类的一种形式。尽管 struct
的成员默认访问权限为 public
,但它也能够像 class
一样显式地指定成员的访问权限为私有或受保护。并且,struct
还可以在其内部声明成员函数,从而实现更为复杂的行为和操作。
以下是 C++ 中 struct
包含成员函数的示例:
struct Student {std::string name;int age;void displayInfo() { // 成员函数std::cout << "Name: " << name << ", Age: " << age << std::endl;}
};
基于上述特性,在实际编程中,建议采取以下最佳实践:
对于仅仅是数据的简单组合,且希望成员默认具有公共访问权限的情况,使用 struct
是一个不错的选择。例如,当定义一些纯粹用于数据传递或存储的结构体时,struct
能够清晰地表达数据的结构,并且方便数据的访问和操作。
当面对更为复杂的对象,涉及到数据的封装、隐藏以及更丰富的行为和操作时,使用 class
进行定义会更为合适。通过将成员设置为私有,并提供公共的接口函数来控制对象的状态和行为,可以更好地实现面向对象编程中的封装和信息隐藏原则,增强代码的健壮性、可维护性和可扩展性。
相关文章:

C/C++关键字大全
目录 一、const 二、static 三、#define 和 typedef 四、#define 和 inline 五、#define 和 const 六、new 和 malloc 七、const 和 constexpr 八、volatile 九、extern 十、前置 和后置 十一、atomic 十二、struct 和 class 一、const 1、const 关键字可用于定义…...

ROS2 Linux Mint 22 安装教程
前言: 本教程在Linux系统上使用。 一、linux安装 移动硬盘安装linux:[LinuxToGo教程]把ubuntu装进移动固态,随时随用以下是我建议安装linux mint版本的清单: 图吧工具箱:https://www.tbtool.cn/linux mint: https://…...

快速将网站从HTTP升级为HTTPS
在当今数字化的世界中,网络安全变的越来越重要,HTTPS(超文本传输安全协议)不仅能够提供加密的数据传输,还能增强用户信任度,提升搜索引擎排名,为网站带来多重益处。所以将网站从HTTP升级到HTTPS…...

Qt程序移植至Arm开发板
目录 1.工具准备: 系统调试工具SecureCRT 虚拟机安装linux(Ubuntu) 交叉编译工具链 ARM 端Qt 环境(Qt-5.7.1) 1) linux processor SD安装 2)交叉编译工具链配置 2.编译Qt工程: 2.0 交叉编译 依赖库源码,生成动…...

删除分区 全局索引 drop partition global index Statistics变化
1.不一定unusable,可以先删除data (index 再删除过程中会更新结构)再drop/truncate. ---------------------- CREATE TABLE interval_sale ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE ) PARTITION BY RANGE (time_i…...

git回退未commit、回退已commit、回退已push、合并某一次commit到另一个分支
文章目录 1、git回退未commit2、git回退已commit3、git回退已push的代码3.1 直接丢弃某一次的push3.2 撤销push后,不丢弃改动,重新修改后要再次push 4、合并某一次commit到另一个分支 整理几个工作上遇到的git问题。 1、git回退未commit git回退未comm…...

yolov8pose 部署rknn(rk3588)、部署地平线Horizon、部署TensorRT,部署工程难度小、模型推理速度快,DFL放后处理中
特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 之前写了yolov8、yolov8seg、yolov8obb 的 DFL 放在模型中和放在后处理…...
程序员找工作之操作系统面试题总结分析
程序员在找工作面试时,操作系统方面可能会被问到的问题涵盖了多个核心知识点和概念。以下是对这些面试问题的总结和分析: 1. 核心硬件与体系结构 微机的核心部件:询问微机硬件系统中最核心的部件是什么(CPU)。处理机…...
TypeScript 迭代器和生成器详解
目录 迭代器(Iterators) 生成器(Generators) 使用场景 for..of vs. for..in 语句 for..of 循环 for..in 循环 区别总结 注意事项 总结 在 TypeScript 中,迭代器(Iterators)和生成器&am…...

echarts 极坐标柱状图 如何定义柱子颜色
目录 echarts 极坐标柱状图 如何定义柱子颜色问题描述方式一 在 series 数组中定义颜色方式二 通过 colorBy 和 color 属性配合使用 echarts 极坐标柱状图 如何定义柱子颜色 本文将分享在使用 echarts 的 极坐标柱状图 时,如何自定义柱子的颜色。问题本身并不难解决…...

JavaScript模块化
JavaScript模块化 一、CommonJS规范1、在node环境下的模块化导入、导出 2、浏览器环境下使用模块化browserify编译js 二、ES6模块化规范1、在浏览器端的定义和使用2、在node环境下简单使用方式一:方式二: 3、导出数据4、导入数据5、数据引用问题 一、Com…...

文件包含漏洞Tomato靶机渗透_详解
一、导入靶机 将下载好的靶机拖入到VMware中,填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段,发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…...
湖北汽车工业学院-高等数学考纲
湖北汽车工业学院2024年普通专升本考试的《高等数学》考试大纲已经公布。考试形式为闭卷笔试,满分100分,考试时间为90分钟。考试内容主要包括以下几个部分: 1. **函数、极限、连续**: 涉及函数概念、表示法、有界性、周期性、奇偶…...

Linux:Xshell相关配置及前期准备
一、Linux的环境安装 1、裸机安装或者是双系统 2、虚拟机的安装 3、云服务器(推荐)——>安装简单,维护成本低,学习效果好,仿真性高(可多人一起用一个云服务器) 1.1 购买云服务器 使用云服…...

模型 正态分布(通俗解读)
系列文章 分享 模型,了解更多👉 模型_思维模型目录。随机世界的规律,大自然里的钟形曲线。 1 正态分布的应用 1.1 质量管理之六西格玛 六西格玛是一种旨在通过识别和消除缺陷原因来提高制造过程或业务流程质量的管理策略。我们先来了解下六…...
安装了Vue-pdf后,打包文件多出了worker.js和worker.js.gz
解决方式: 修改node_modules/worker-loader/dist/index文件 将 const filename _loaderUtils2.default.interpolateName(this, options.name || 中的 js/[hash].worker.js,更改为 static/js/[hash].worker.js...
使用excel生成国际化多语言js文件的脚本
1、创建一个空文件夹 2、终端 cnpm install xlsx3、在文件夹创建一个index.js // 导入 Node.js 内置的 fs 模块 const fs = require(fs); // 导入 xlsx 模块,用于处理 Excel 文件 const XLSX = require(xlsx);// 读取 Excel 文件 function readExcelFile(filePath) {const …...

【蝉联】摩斯再次获得“中国隐私计算市场份额第一”
蝉联第一 8月2日,全球领先的IT市场研究和咨询公司IDC发布了《中国隐私计算平台厂商市场份额,2023》报告。蚂蚁集团凭借商用隐私计算平台摩斯(MORSE),以 35.3%的市场份额蝉联第一。 2023年,中国隐私计算平台…...

安装 qcloud-python-sts 失败 提示 gbk codecs decode byte 应该如何解决
安装 qcloud-python-sts 失败 提示 gbk codecs decode byte 应该如何解决 解决方案: 将windows 修改为utf-8编码格式 解决步骤如下: 1. 进入控制台 2. 点击区域 4. 点击管理 4.勾选UTF-8 5.重启系统即可...

mv:自动对焦代码
try:# The camera will now focus on whatever is in front of it.sensor.ioctl(sensor.IOCTL_TRIGGER_AUTO_FOCUS) except:raise (Exception("Auto focus is not supported by your sensor/board combination."))...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...