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."))...
【C++】数组案例 五只小猪称体重
题目:给出物质小猪体重,找出最大的体重的值并打印 思路:利用菽粟写入五只小猪的体重,让每一个元素都赋值给一个整型变量并每赋值一次就于下一个数组中的元素比,若是大就继续赋值给这个变量,若是小则不赋值…...
Bug 解决 | 后端项目无法正常启动,或依赖服务连接失败
目录 1、版本问题 2、依赖项问题 明明拷贝的代码,为什么别人行,我启动就报错? 这篇文章我就理一下最最常见的项目启动报错的两种原因! 1、版本问题 比如明明项目的 Java 版本是 8,你非得拿 5 跑?那不是…...
Linux: network: mlx5_core crash;dos
https://bugzilla.redhat.com/show_bug.cgi?idCVE-2024-41090 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id8be915fc5ff9a5e296f6538be12ea75a1a93bdea https://www.openwall.com/lists/oss-security/2024/07/24/4 是tap的驱动向下传递的包…...
用手机剪辑视频素材从哪里找?用手机视频素材库分享
视频编辑是一门充满创意的艺术,无论是制作短片、广告还是个人Vlog,都离不开高质量的视频素材。如果自己拍摄的素材不能完全满足创作需求,或者需要更多样化的内容来丰富视频,那么优质的视频素材来源至关重要。下面推荐几个提供高品…...
DataStream API使用Sink及自定义Sink
目录 Data Sinks 案例 自定义Sink Human实体类 自定义RichSinkFunction MySQL Sink使用 测试 Data Sinks 数据接收器(Data sinks)消费数据流并将它们转发到文件、套接字、外部系统或打印它们。Flink带有各种内置输出格式,这些格式被封装在数据流的算子后面: …...
C++标准模板(STL)- 类型支持 (类型属性,检查类型是否拥有强结构相等性,std::has_strong_structural_equality)
类型特性 类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…...
《中国数据库前世今生》观影——2000年代/数据库分型及国产数据库开端
引出 《中国数据库前世今生》观影——2000年代/数据库分型及国产数据库开端 第3集:2000年代/数据库分型及国产数据库开端 y2k问题 千年虫,又叫做“计算机2000年问题”“电脑千禧年千年虫问题”或“千年危机”。缩写为“Y2K]”。是指在某些使用了计算机…...
图的同态Graph Homomorphism与同构Graph Isomorphism
图的同态Graph Homomorphism 图的同态(Graph Homomorphism)是图论中的一个重要概念,用于描述图之间的一种映射关系。图的同态描述了一个图如何通过映射保留其边的结构。 ### 图的同态定义 设有两个图 \( G (V_G, E_G) \) 和 \( H (V_H, …...
使用 Python 对雷达卫星 sar 图像进行降噪的三种方法
合成孔径雷达 (SAR) 图像广泛应用于各种领域(航空航天、军事、气象等)。问题是这种图像在其原始格式中受到噪点的影响。虽然这些图像通常也是沉重的文件,但从科学的角度来看,有效地对其进行去噪的任务似乎既具有挑战性,又在现实世界中非常有用。 卫星图像有两大类: 光学…...
C# Unity 面向对象补全计划 之 初识继承方法与多态
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列旨在通过补全学习之后,给出任意类图都能实现并做到逻辑上严丝合缝 1.继承方法 C# & Unity 面向对象补全计划 之 继承(字段与属性&…...
怎么把网站制作成app/网站定制开发
benchmark工具使用练习1说明2 实验目的3 任务内容4 实验原理一、影响性能的关键因素二、benchmark工具介绍及参数详解5 操作步骤6 实际操作1说明 本实验所有代码均在ubuntu 18.04 OpenVINO 2020R3.LTS installed 环境下验证通过,若需要代码移植,请务必…...
办公空间设计思路/台州关键词优化平台
替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”例如输入“we are best ”,则输出we%20are%20 best 此题的实际意义是在网络编程中,如果URL中含有特殊的字符如空格、‘#’等可能导致服务器无法获取正常的参数,我们需要…...
公司官网站怎么搞/关于软文营销的案例
虚拟机中的概念是这样的: 1、宿主机:指要安装虚拟机软件的计算机,你花钱买的物理机。 2、虚拟机:利用虚拟机工具构造出来的,有一整套硬件设备,有自己操作系统,应用软件。 3、宿主操作系统&#…...
做网站的公司多少钱/网站seo优化总结
获取上传类 ThinkPHP的扩展中提供了文件上传类库UploadFile,可以在在http://www.thinkphp.cn/extend/224.html下载,或者下载官方的完整扩展包(http://www.thinkphp.cn/down/253.html)里面也已经包含上传扩展类了。如果是单独下载的…...
石家庄网站建设石家庄/电商培训有用吗
编译 | 凌敏、核子可乐 又一地区强制要求企业公开薪酬数据,律师:未来薪资透明才是常态。近日,美国数据收集网站 Levels.fyi 发布了 2022 年度程序员薪酬报告,根据职位、地域对各公司的薪酬情况进行了总结。据介绍,Leve…...
有那些做任务的网站/博客营销案例
继续填坑 模式 考虑下面的代码: function fn(x) {//do somethingreturn new Promise(function(resolve, reject) {//调用resolve(..)和reject(...)});}var p fn(2); new Promise(..)模式通常称为revealing constructor。传入函数会立即执行(不会像then(..)中的回调…...