当前位置: 首页 > 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…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...