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

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的枚举类型,并声明了三个枚举常量REDGREENBLUE。这些常量都属于Color类型,它们实际上是整数值,默认从0开始递增。

main()函数中,我们创建了一个myColor变量,并将其初始化为RED枚举常量。我们可以使用if语句来检查myColor的值,根据不同的情况执行相应的逻辑。

需要注意的是,枚举常量是命名的整数值,并且可以通过名称进行比较和赋值操作。此外,我们也可以指定枚举常量的具体整数值,例如:

enum Status {OK = 200,NOT_FOUND = 404,INTERNAL_ERROR = 500
};

在这个示例中,我们为枚举常量OKNOT_FOUNDINTERNAL_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++中,可以使用以下几种方法来释放动态分配的内存:

  1. 使用delete释放单个对象的内存:

    int* ptr = new int;  // 动态分配一个整数对象的内存
    // 使用分配的内存
    delete ptr;  // 释放内存
    
  2. 使用delete[]释放数组的内存:

    int* arr = new int[5];  // 动态分配一个整数数组的内存
    // 使用分配的内存
    delete[] arr;  // 释放内存
    
  3. 使用free函数释放通过malloccallocrealloc分配的内存:

    int* ptr = (int*)malloc(sizeof(int));  // 分配内存
    // 使用分配的内存
    free(ptr);  // 释放内存
    

需要注意的是:

  • 动态分配的内存必须由相应的释放函数进行释放,以避免内存泄漏。
  • 在释放内存之后,不要再访问已释放的内存块,以免发生未定义行为。
  • 删除或释放空指针是安全的,因此在释放内存之后最好将指针设置为nullptr,以防止误用。

另外,使用智能指针(如std::unique_ptrstd::shared_ptr)等现代C++特性可以更方便地管理内存,并避免手动释放内存的问题。这些智能指针会在不再需要时自动释放它们持有的内存。

C++ 参数传递方式

在C++中,有两种主要的参数传递方式:值传递和引用传递。

  1. 值传递:
    • 值传递是将实际参数的副本传递给函数或方法。
    • 在值传递中,函数或方法使用参数的副本进行操作,对原始参数没有影响。
    • 在函数或方法内部,会为参数的副本分配新的内存空间,并在函数或方法调用结束后释放该空间。
    • 值传递不会改变原始参数的值。

示例代码:

void modifyValue(int x) {x = 10;  // 修改参数的副本
}int main() {int num = 5;modifyValue(num);  // 值传递// num 的值仍然是 5,没有被修改return 0;
}
  1. 引用传递:
    • 引用传递是将实际参数的引用传递给函数或方法。
    • 在引用传递中,函数或方法使用参数的引用直接对原始参数进行操作。
    • 在函数或方法内部,没有为参数分配新的内存空间,它直接引用了原始参数的内存空间。
    • 引用传递可以改变原始参数的值。

示例代码:

void modifyValue(int& x) {x = 10;  // 直接修改原始参数
}int main() {int num = 5;modifyValue(num);  // 引用传递// num 的值被修改为 10return 0;
}

需要注意的是,无论是值传递还是引用传递,都会在函数或方法调用结束后自动释放传递的参数。但是,在引用传递中,由于直接引用了原始参数的内存空间,所以可以对其进行修改并影响原始参数的值。而值传递只是操作了参数的副本,不会改变原始参数的值。

关于析构函数的特性

C++ 的析构函数(Destructor)是一种特殊的成员函数,用于在对象被销毁时执行清理工作。它的实现原理如下:

  1. 析构函数的命名规则是在类名前加上一个波浪线(~),后接类名,例如~ClassName
  2. 析构函数没有参数,也不能被重载,每个类只能有一个析构函数。
  3. 当对象被销毁时(例如离开作用域、delete 操作符释放动态分配的内存),编译器会自动调用对象的析构函数。
  4. 对象的析构函数按照创建对象的顺序逆序调用,即最后创建的对象先调用析构函数。
  5. 析构函数可以显式定义,也可以使用编译器生成的默认析构函数。
  6. 如果显式定义了析构函数,编译器就不会生成默认的析构函数。
  7. 在析构函数中,可以执行必要的清理工作,如释放动态分配的内存、关闭打开的文件、释放资源等。

在程序运行过程中,当对象即将被销毁时,编译器会自动插入对析构函数的调用。这样可以确保在对象生命周期结束时进行清理操作,避免资源泄漏和内存泄漏问题。

需要注意的是,在有继承关系的类中,基类的析构函数应该声明为虚函数,以便子类能够正确调用其自身的析构函数。这是因为在使用基类指针或引用指向派生类对象时,如果基类的析构函数不是虚函数,那么就无法通过基类指针或引用来调用派生类的析构函数,从而导致资源无法正确释放。

总结:C++ 的析构函数通过编译器自动调用,在对象销毁时执行必要的清理工作,它的实现原理包括命名规则、调用顺序等。合理使用析构函数可以确保资源的正确释放,避免内存泄漏和资源泄漏问题的发生。

C++ 的析构函数实际上是由编译器自动生成和调用的,其实现原理如下:

  1. 自动调用:当对象的生命周期结束时,编译器会自动调用适当的析构函数。这可以发生在以下几种情况下:

    • 对象离开其作用域:当对象在函数中定义,并且超出了其作用域范围时,编译器会自动调用该对象的析构函数。
    • 动态分配内存的对象被释放:如果通过new关键字动态创建了对象并进行了内存分配,在使用delete操作符释放内存时,编译器会自动调用该对象的析构函数。
    • 对象被销毁:当一个对象作为另一个对象的成员时,当包含它的对象被销毁时,编译器会自动调用该成员对象的析构函数。
  2. 生成默认析构函数:如果没有显式定义析构函数,编译器会自动生成一个默认的析构函数。默认析构函数的实现为空,即不执行任何操作。

  3. 显式定义析构函数:在需要进行一些清理工作的情况下,可以显式地在类中定义析构函数。在析构函数的定义中,可以编写所需的清理代码,例如释放动态分配的内存、关闭文件、释放资源等。

  4. 调用顺序:在具有继承关系的类中,当派生类对象被销毁时,会先自动调用派生类的析构函数,然后再调用基类的析构函数。这样可以确保在对象层次结构中的每个类都能够执行必要的清理工作,并按照正确的顺序进行。

需要注意的是,如果在基类中将析构函数声明为虚函数(使用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中&#xff0c;枚举常量&#xff08;Enumeration Constants&#xff09;是一种定义命名常量的方式。枚举类型允许我们为一组相关的常量赋予有意义的名称&#xff0c;并将它们作为一个独立的类型来使用。 以下是定义和使用枚举常量的示例&#xff1a; enum…...

计算机中常说的SDK是什么意思?

SDK是Software Development Kit的英文缩写&#xff0c;意思是软件开发包。 软件开发包中往往包含有多种辅助进行软件开发的内容&#xff0c;包括一些软件开发工具、文档说明、库和示例代码。这些内容能够帮助使用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的图像合成数据集

当前从文本输入生成合成图像的模型不仅能够生成非常逼真的照片&#xff0c;而且还能够处理大量不同的对象。 在论文“评估使用稳定扩散生成的合成图像数据集”中&#xff0c;我们使用“稳定扩散”模型来研究哪些对象和类型表现得如此逼真&#xff0c;以便后续图像分类正确地分配…...

云计算:常用运维软件工具

目录 一、理论 1.云管理工具 2.虚拟化工具 3.容器管理工具 4.运维自动化工具 5.版本控制工具 6.配置管理工具 7.编辑器工具 8.代码质量工具 9.网络管理工具 10.数据库管理工具 11.数据中心设备管理工具 12.数据可视化工具 13.服务器管理工具 14.应用性能管理工具…...

多测师肖sir_高级金牌讲师_python的安装002

一、python安装 1、python包&#xff08;我们目前学习的版本是3.7&#xff09; python-3.7.3 版本 2、Python下载的官网&#xff1a;https://www.python.org/downloads/ 最新包&#xff1a;3.12 3、下载好python安装包&#xff0c;在新建一个python文件件&#xff0c;我们要…...

gin实现event stream

event stream是属于http的一种通信方式&#xff0c;可以实现服务器主动推送。原理于客户端请求服务器之后一直保持链接&#xff0c;服务端持续返回结果给客户端。相比较于websocket有如下区别&#xff1a; 基于http的通信方式&#xff0c;在各类框架的加持下不需要开发人员自己…...

pytorch中transform库中常用的函数有哪些及其用法?

在PyTorch的torchvision.transforms库中&#xff0c;有许多常用的图像变换函数可用于数据增强和预处理。下面列举了一些常用的函数及其用法&#xff1a; Resize(size): 调整图像大小为给定的尺寸。 transform transforms.Resize((256, 256))RandomCrop(size, paddingNone): 随…...

抖音手机实景无人直播间怎么搭建?

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

【新书推荐】当 Python 遇到 ChatGPT —— 自动化办公落地

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

RSA攻击:Smooth攻击

目录 前言&#xff1a;缘起 P-1光滑攻击 P1光滑攻击 前缀知识 Lucas-Subsquence(卢卡斯序列) 编码实现与理解 小试牛刀 [NCTF 2019]childRSA 引用 前言&#xff1a;缘起 Smooth攻击(光滑攻击)&#xff0c;在最近刷题的时候总是能偶尔蹦跶到我的脑子里面。不是天天遇见它&am…...

什么是位域和位段?如何定义和使用位域?

位域&#xff08;Bit Fields&#xff09;是C语言中一种用于在数据结构中以位为单位对数据进行精确控制的技术。它们允许程序员将一个整数字段分割成多个更小的部分&#xff0c;每个部分可以存储不同的信息。位域通常在对内存节省要求高、数据压缩或硬件寄存器描述等情况下使用。…...

网络攻防备课笔记

从“踩点”到“创建后门”的攻击流程 踩点&#xff1a;攻击者在实施攻击前对目标进行初步的探索和调查的过程&#xff0c;包括收集目标的IP地址、开放的端口、服务版本、可能的漏洞等信息。 扫描&#xff1a;使用工具如Nmap、Masscan等对目标进行端口扫描&#xff0c;找出开放…...

Apache Solr9.3 快速上手

Apache Solr 简介 Solr是Apache的顶级开源项目&#xff0c;使用java开发 &#xff0c;基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句&#xff0c;而且它可扩展、可配置&#xff0c;同时它对Lucene的性能进行了优化。 安装 下载 : 下载地址解压 : tar -zxv…...

按关键字搜索淘宝商品API接口获取商品销量、优惠价、商品标题等参数示例

关键词搜索商品接口的作用是提供搜索功能&#xff0c;让用户根据关键词在电商平台上搜索商品&#xff0c;并根据搜索条件和偏好获取相关的商品列表和推荐结果&#xff0c;提高用户购物体验和准确度。对于电商平台而言&#xff0c;这个接口也能帮助用户发现更多商品、提升销量和…...

【外汇天眼】价格波动的节奏感:优化止盈方法!

止盈&#xff0c;依然是一种经验&#xff0c;而不是一种技术。它涉及到价格波动的灵活应对&#xff0c;以确保我们不会错失潜在的盈利&#xff0c;同时也不会让盈利被逆市波动所侵蚀。以下是关于如何有效实施止盈策略的一些建议&#xff1a; 首先&#xff0c;我们要明确&#…...

VMvare虚拟机安装国产麒麟V10桌面操作系统

一、系统下载 进入银河麒麟官网&#xff1a;https://www.kylinos.cn/ 选择桌面操作系统&#xff0c;然后进入操作系统版本选择页面&#xff0c;选择银河麒麟桌面操作系统V10 选择后&#xff0c;进入系统介绍页面&#xff0c;然后点击申请试用 点击后进入申请页面&#xf…...

Golang--channel+waitGroup控制并发量

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

前端【响应式图片处理】之 【picture标签】

目录 &#x1f31f;前言&#x1f31f;目前最常见的解决方案&#x1f31f;新的解决方案<picture>&#x1f31f;<picture>的工作原理&#x1f31f;<picture> 兼容性解决方案&#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;前端开发过程中经…...

js实现链式调用,查询和处理数据

实现一个 query 方法&#xff0c;实现对数据的链式查询和处理 要求如下 query 传入参数为原始数据&#xff08;数组格式&#xff0c;每个元素都是对象&#xff09; 通过进行链式调用对数据执行操作&#xff0c;支持的方法有where(predicate): 根据参数的条件进行筛选&#xff0…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

联邦学习带宽资源分配

带宽资源分配是指在网络中如何合理分配有限的带宽资源&#xff0c;以满足各个通信任务和用户的需求&#xff0c;尤其是在多用户共享带宽的情况下&#xff0c;如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源&#xff0c;通常指的是单位时间…...