C++开发学习笔记3
C++ 中枚举的使用
在C++中,枚举常量(Enumeration Constants)是一种定义命名常量的方式。枚举类型允许我们为一组相关的常量赋予有意义的名称,并将它们作为一个独立的类型来使用。
以下是定义和使用枚举常量的示例:
enum Color {RED,GREEN,BLUE
};int main() {Color myColor = RED;if (myColor == GREEN) {// 执行GREEN相关的逻辑} else if (myColor == BLUE) {// 执行BLUE相关的逻辑} else {// 执行默认逻辑(RED)}return 0;
}
在上述代码中,我们定义了一个名为Color
的枚举类型,并声明了三个枚举常量RED
、GREEN
和BLUE
。这些常量都属于Color
类型,它们实际上是整数值,默认从0开始递增。
在main()
函数中,我们创建了一个myColor
变量,并将其初始化为RED
枚举常量。我们可以使用if
语句来检查myColor
的值,根据不同的情况执行相应的逻辑。
需要注意的是,枚举常量是命名的整数值,并且可以通过名称进行比较和赋值操作。此外,我们也可以指定枚举常量的具体整数值,例如:
enum Status {OK = 200,NOT_FOUND = 404,INTERNAL_ERROR = 500
};
在这个示例中,我们为枚举常量OK
、NOT_FOUND
和INTERNAL_ERROR
分别指定了整数值200、404和500。这样做可以在需要时将枚举常量与特定的整数值相关联。
总之,C++中的枚举常量提供了一种定义有意义的命名常量的方式,并使得代码更易读、更具可维护性。
C++ 中程序睡眠
在 C++ 中,可以使用 <thread>
头文件中的 sleep_for()
函数来实现睡眠功能。sleep_for()
函数接受一个时间段作为参数,指定程序需要休眠的时间长度。
下面是一个示例代码,展示了如何在 C++ 中使用 sleep_for()
函数实现睡眠功能:
#include <iostream>
#include <thread> // 包含 <thread> 头文件int main() {std::cout << "开始执行程序" << std::endl;// 休眠 2 秒std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "休眠结束,继续执行程序" << std::endl;return 0;
}
在上面的示例中,我们通过调用 std::this_thread::sleep_for()
函数并传入 `std::chrono::seconds
C++ 如何释放内存
在C++中,可以使用以下几种方法来释放动态分配的内存:
-
使用
delete
释放单个对象的内存:int* ptr = new int; // 动态分配一个整数对象的内存 // 使用分配的内存 delete ptr; // 释放内存
-
使用
delete[]
释放数组的内存:int* arr = new int[5]; // 动态分配一个整数数组的内存 // 使用分配的内存 delete[] arr; // 释放内存
-
使用
free
函数释放通过malloc
、calloc
或realloc
分配的内存:int* ptr = (int*)malloc(sizeof(int)); // 分配内存 // 使用分配的内存 free(ptr); // 释放内存
需要注意的是:
- 动态分配的内存必须由相应的释放函数进行释放,以避免内存泄漏。
- 在释放内存之后,不要再访问已释放的内存块,以免发生未定义行为。
- 删除或释放空指针是安全的,因此在释放内存之后最好将指针设置为
nullptr
,以防止误用。
另外,使用智能指针(如std::unique_ptr
和std::shared_ptr
)等现代C++特性可以更方便地管理内存,并避免手动释放内存的问题。这些智能指针会在不再需要时自动释放它们持有的内存。
C++ 参数传递方式
在C++中,有两种主要的参数传递方式:值传递和引用传递。
- 值传递:
- 值传递是将实际参数的副本传递给函数或方法。
- 在值传递中,函数或方法使用参数的副本进行操作,对原始参数没有影响。
- 在函数或方法内部,会为参数的副本分配新的内存空间,并在函数或方法调用结束后释放该空间。
- 值传递不会改变原始参数的值。
示例代码:
void modifyValue(int x) {x = 10; // 修改参数的副本
}int main() {int num = 5;modifyValue(num); // 值传递// num 的值仍然是 5,没有被修改return 0;
}
- 引用传递:
- 引用传递是将实际参数的引用传递给函数或方法。
- 在引用传递中,函数或方法使用参数的引用直接对原始参数进行操作。
- 在函数或方法内部,没有为参数分配新的内存空间,它直接引用了原始参数的内存空间。
- 引用传递可以改变原始参数的值。
示例代码:
void modifyValue(int& x) {x = 10; // 直接修改原始参数
}int main() {int num = 5;modifyValue(num); // 引用传递// num 的值被修改为 10return 0;
}
需要注意的是,无论是值传递还是引用传递,都会在函数或方法调用结束后自动释放传递的参数。但是,在引用传递中,由于直接引用了原始参数的内存空间,所以可以对其进行修改并影响原始参数的值。而值传递只是操作了参数的副本,不会改变原始参数的值。
关于析构函数的特性
C++ 的析构函数(Destructor)是一种特殊的成员函数,用于在对象被销毁时执行清理工作。它的实现原理如下:
- 析构函数的命名规则是在类名前加上一个波浪线(~),后接类名,例如
~ClassName
。 - 析构函数没有参数,也不能被重载,每个类只能有一个析构函数。
- 当对象被销毁时(例如离开作用域、delete 操作符释放动态分配的内存),编译器会自动调用对象的析构函数。
- 对象的析构函数按照创建对象的顺序逆序调用,即最后创建的对象先调用析构函数。
- 析构函数可以显式定义,也可以使用编译器生成的默认析构函数。
- 如果显式定义了析构函数,编译器就不会生成默认的析构函数。
- 在析构函数中,可以执行必要的清理工作,如释放动态分配的内存、关闭打开的文件、释放资源等。
在程序运行过程中,当对象即将被销毁时,编译器会自动插入对析构函数的调用。这样可以确保在对象生命周期结束时进行清理操作,避免资源泄漏和内存泄漏问题。
需要注意的是,在有继承关系的类中,基类的析构函数应该声明为虚函数,以便子类能够正确调用其自身的析构函数。这是因为在使用基类指针或引用指向派生类对象时,如果基类的析构函数不是虚函数,那么就无法通过基类指针或引用来调用派生类的析构函数,从而导致资源无法正确释放。
总结:C++ 的析构函数通过编译器自动调用,在对象销毁时执行必要的清理工作,它的实现原理包括命名规则、调用顺序等。合理使用析构函数可以确保资源的正确释放,避免内存泄漏和资源泄漏问题的发生。
C++ 的析构函数实际上是由编译器自动生成和调用的,其实现原理如下:
-
自动调用:当对象的生命周期结束时,编译器会自动调用适当的析构函数。这可以发生在以下几种情况下:
- 对象离开其作用域:当对象在函数中定义,并且超出了其作用域范围时,编译器会自动调用该对象的析构函数。
- 动态分配内存的对象被释放:如果通过
new
关键字动态创建了对象并进行了内存分配,在使用delete
操作符释放内存时,编译器会自动调用该对象的析构函数。 - 对象被销毁:当一个对象作为另一个对象的成员时,当包含它的对象被销毁时,编译器会自动调用该成员对象的析构函数。
-
生成默认析构函数:如果没有显式定义析构函数,编译器会自动生成一个默认的析构函数。默认析构函数的实现为空,即不执行任何操作。
-
显式定义析构函数:在需要进行一些清理工作的情况下,可以显式地在类中定义析构函数。在析构函数的定义中,可以编写所需的清理代码,例如释放动态分配的内存、关闭文件、释放资源等。
-
调用顺序:在具有继承关系的类中,当派生类对象被销毁时,会先自动调用派生类的析构函数,然后再调用基类的析构函数。这样可以确保在对象层次结构中的每个类都能够执行必要的清理工作,并按照正确的顺序进行。
需要注意的是,如果在基类中将析构函数声明为虚函数(使用virtual
关键字),则在通过基类指针或引用删除派生类对象时,会调用正确的析构函数。这是因为虚析构函数允许动态绑定,在运行时选择正确的析构函数。
总结:C++ 的析构函数实际上是由编译器自动生成和调用的,它的实现原理涉及自动调用、默认生成、显式定义和调用顺序等方面。合理使用析构函数可以确保资源的正确释放,避免内存泄漏和资源泄漏问题的发生。
C++ 全局变量
C++ 中的全局变量是在函数外部定义的变量,可以在程序的任何地方使用。全局变量在整个程序中都是可见的,可以被多个函数或模块使用。
在C++中,全局变量的声明通常放在头文件中,并且在源文件中进行定义和初始化。全局变量可以有不同的存储类别(如 static、extern 等),它们决定了全局变量的作用域和生命周期。
以下是一个示例:
// 头文件 global_var.h
extern int globalVar; // 声明全局变量// 源文件 main.cpp
#include "global_var.h"int globalVar = 10; // 定义并初始化全局变量void func()
{// 在这里可以使用全局变量 globalVar
}int main()
{// 在这里也可以使用全局变量 globalVarreturn 0;
}
需要注意的是,全局变量的使用应该谨慎,因为它们具有全局作用域,可能会导致代码的可读性和维护性下降。过多地依赖全局变量可能会增加代码之间的耦合性,使程序难以理解和调试。因此,在设计程序时,应尽量避免过度使用全局变量。
相关文章:
C++开发学习笔记3
C 中枚举的使用 在C中,枚举常量(Enumeration Constants)是一种定义命名常量的方式。枚举类型允许我们为一组相关的常量赋予有意义的名称,并将它们作为一个独立的类型来使用。 以下是定义和使用枚举常量的示例: enum…...
计算机中常说的SDK是什么意思?
SDK是Software Development Kit的英文缩写,意思是软件开发包。 软件开发包中往往包含有多种辅助进行软件开发的内容,包括一些软件开发工具、文档说明、库和示例代码。这些内容能够帮助使用SDK进行软件开发的人员更好地开发程序。 SDK的作用就是简化软件…...

漏刻有时数据可视化大屏(16)数据指标KPI和柱图折线图混排
CSS样式表 /*面板*/ .pannel {width: 100%;margin-top: 30px;clear: both; }.item_l {float: left;width: 20%; /*3格60%*/margin: 0; }.item_r {float: left;width: 10%; /*4格40%*/margin: 0; }.item_child {float: left;width: 50%; }.item_child_b {float: left;width: 10…...

基于Stable Diffusion的图像合成数据集
当前从文本输入生成合成图像的模型不仅能够生成非常逼真的照片,而且还能够处理大量不同的对象。 在论文“评估使用稳定扩散生成的合成图像数据集”中,我们使用“稳定扩散”模型来研究哪些对象和类型表现得如此逼真,以便后续图像分类正确地分配…...
云计算:常用运维软件工具
目录 一、理论 1.云管理工具 2.虚拟化工具 3.容器管理工具 4.运维自动化工具 5.版本控制工具 6.配置管理工具 7.编辑器工具 8.代码质量工具 9.网络管理工具 10.数据库管理工具 11.数据中心设备管理工具 12.数据可视化工具 13.服务器管理工具 14.应用性能管理工具…...

多测师肖sir_高级金牌讲师_python的安装002
一、python安装 1、python包(我们目前学习的版本是3.7) python-3.7.3 版本 2、Python下载的官网:https://www.python.org/downloads/ 最新包:3.12 3、下载好python安装包,在新建一个python文件件,我们要…...
gin实现event stream
event stream是属于http的一种通信方式,可以实现服务器主动推送。原理于客户端请求服务器之后一直保持链接,服务端持续返回结果给客户端。相比较于websocket有如下区别: 基于http的通信方式,在各类框架的加持下不需要开发人员自己…...
pytorch中transform库中常用的函数有哪些及其用法?
在PyTorch的torchvision.transforms库中,有许多常用的图像变换函数可用于数据增强和预处理。下面列举了一些常用的函数及其用法: Resize(size): 调整图像大小为给定的尺寸。 transform transforms.Resize((256, 256))RandomCrop(size, paddingNone): 随…...

抖音手机实景无人直播间怎么搭建?
手机无人直播已成为用户直播和商家直播带货的一项热门技术趋势,为消费者提供了全新的观看体验。无人直播,顾名思义,即通过无人直播软件或数字人来进行无人直播。这一技术的广泛应用,不仅为短视频渠道带来了更丰富的玩法࿰…...

【新书推荐】当 Python 遇到 ChatGPT —— 自动化办公落地
文章目录 当 Python 遇到 ChatGPT:一种强大的组合1. 文本生成2. 自动翻译3. 对话生成4. 情感分析 新书推荐《Python自动化办公应用大全(ChatGPT版):从零开始教编程小白一键搞定烦琐工作(上下册)》前言内容简…...

RSA攻击:Smooth攻击
目录 前言:缘起 P-1光滑攻击 P1光滑攻击 前缀知识 Lucas-Subsquence(卢卡斯序列) 编码实现与理解 小试牛刀 [NCTF 2019]childRSA 引用 前言:缘起 Smooth攻击(光滑攻击),在最近刷题的时候总是能偶尔蹦跶到我的脑子里面。不是天天遇见它&am…...
什么是位域和位段?如何定义和使用位域?
位域(Bit Fields)是C语言中一种用于在数据结构中以位为单位对数据进行精确控制的技术。它们允许程序员将一个整数字段分割成多个更小的部分,每个部分可以存储不同的信息。位域通常在对内存节省要求高、数据压缩或硬件寄存器描述等情况下使用。…...
网络攻防备课笔记
从“踩点”到“创建后门”的攻击流程 踩点:攻击者在实施攻击前对目标进行初步的探索和调查的过程,包括收集目标的IP地址、开放的端口、服务版本、可能的漏洞等信息。 扫描:使用工具如Nmap、Masscan等对目标进行端口扫描,找出开放…...

Apache Solr9.3 快速上手
Apache Solr 简介 Solr是Apache的顶级开源项目,使用java开发 ,基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对Lucene的性能进行了优化。 安装 下载 : 下载地址解压 : tar -zxv…...
按关键字搜索淘宝商品API接口获取商品销量、优惠价、商品标题等参数示例
关键词搜索商品接口的作用是提供搜索功能,让用户根据关键词在电商平台上搜索商品,并根据搜索条件和偏好获取相关的商品列表和推荐结果,提高用户购物体验和准确度。对于电商平台而言,这个接口也能帮助用户发现更多商品、提升销量和…...

【外汇天眼】价格波动的节奏感:优化止盈方法!
止盈,依然是一种经验,而不是一种技术。它涉及到价格波动的灵活应对,以确保我们不会错失潜在的盈利,同时也不会让盈利被逆市波动所侵蚀。以下是关于如何有效实施止盈策略的一些建议: 首先,我们要明确&#…...

VMvare虚拟机安装国产麒麟V10桌面操作系统
一、系统下载 进入银河麒麟官网:https://www.kylinos.cn/ 选择桌面操作系统,然后进入操作系统版本选择页面,选择银河麒麟桌面操作系统V10 选择后,进入系统介绍页面,然后点击申请试用 点击后进入申请页面…...

Golang--channel+waitGroup控制并发量
文章目录 channelwaitGroup控制并发量前言示例 channelwaitGroup控制并发量 前言 golang的goroutine非常轻量级,同时启动数万协程都没问题。如果不对并发量进行控制,比如同时产生数百万的协程,会压垮服务器通过控制channel缓冲区的大小&…...

前端【响应式图片处理】之 【picture标签】
目录 🌟前言🌟目前最常见的解决方案🌟新的解决方案<picture>🌟<picture>的工作原理🌟<picture> 兼容性解决方案🌟写在最后 🌟前言 哈喽小伙伴们,前端开发过程中经…...
js实现链式调用,查询和处理数据
实现一个 query 方法,实现对数据的链式查询和处理 要求如下 query 传入参数为原始数据(数组格式,每个元素都是对象) 通过进行链式调用对数据执行操作,支持的方法有where(predicate): 根据参数的条件进行筛选࿰…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...