第十九章:特殊工具与技术
第十九章:特殊工具与技术
对于很多程序员来说,他们很少会用到本章的介绍的内容。
一.控制内存分配
我们能够重载new和delete,但其实不是对new和delete的重载,只是对new和delete操作符后面的函数进行重载。
当我们使用一条new表达式的时候,第一步new表达式调用一个名为operator new或operator new [] 的函数分配内存空间。第二步,编译器运行构造函数构造对象并传入初始值,第三步,返回一个指向该对象的指针。
当我们使用一条delete表达式的时候,第一步执行析构函数,第二步调用operator delete或operator delete []释放内存空间。
如果希望控制内存分配的过程,可以定义自己的operator new函数和operator delete函数。可以在全局作用域中定义这两个函数,也可以定义为成员函数。当编译器发现一条new或delete表达式时且对象是类类型,则先在类和基类的作用域中找这两个函数。当我们定义为成员函数时,这两类函数是隐式静态的。因为operator new用在对象构造之前,operator delete用在对象析构之后,所以必须是静态的且不能使用类的任何数据成员。
要实现这两类函数,可以使用malloc和free。
二.运行时内存识别
运行时内存识别的功能由两个运算符实现:typeid:用于返回表达式的类型;dynamic_cast:用于将基类的指针或引用安全的转换成派生类的指针或引用。
RTTI可以让我们在不能使用虚函数的情况下实现多态。
typeid操作的结果是一个常量对象的引用,该对象的类型是标准库类型type_info或type_info的公有派生类型。
当typeid作用于指针时(而非指针所指的对象),返回的结果是该指针的静态编译类型。
如果表达式的动态类型和静态类型不同,typeid会在运行时对表达式求值以确定返回的类型。
三.枚举类型
枚举类型使我们可以将一组整形常量组织在一起。每个枚举类型定义了一种新的类型,枚举属于字面值常量类型。
C++包含两种枚举:限定作用域和不限定作用域的。限定作用域是C++11新标准引入的,定义方式为在定义的时候在enum后面加上class或struct。
在限定作用域的枚举类型中,枚举成员的名字遵循常规的作用域准则,并且在枚举类型的作用域外是不可访问的(可以用作用域运算符访问);在不限定作用域的枚举类型中,枚举成员的作用域与枚举类型本身的作用域相同。
默认情况下,枚举值从0开始,依次加1,不过我们也能为一个或几个枚举成员指定专门的值。枚举值不一定唯一。枚举成员是const的。
enum是由某种整型类型表示的,在C++11新标准中,我们可以在enum的名字后加上冒号以及我们想在该enum中使用的类型。如果不加,限定的默认是int,非限定的默认不知。
四.类成员指针
成员指针是指可以指向类的非静态成员的指针。一般情况下指针指向一个对象,但是成员指针指向的是类的成员,而不是某个特定对象。
成员指针的类型囊括了类的类型及成员的类型。当初始化一个这样的指针时,我们令其指向类的某个成员,但是不指定该成员所属的对象;直到使用成员指针时,才提供成员所属的对象。
常规的访问控制规则对成员指针同样有效。
五.嵌套类
一个类可以定义在另一个类的内部,前者称为嵌套类或嵌套类型。
嵌套类和外部类没有什么特别的关系,只是嵌套类位于外部类的作用域中,受外部类的访问控制,两者都不含对方的成员。
六.union:一种节省空间的类
联合(union)是一种特殊的类。可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。分配给一个union对象的存储空间至少要能容纳它的最大成员。union可以为其成员指定public,protected和private等标记,默认为public。可以定义包括构造函数和析构函数在内的成员函数,不能定义虚函数。
匿名union是一个未命名的union,并且在右花括号和分号之间没有任何生命。一旦我们定义了一个匿名union,编译器就会自动为该union生成一个未命名的对象,在匿名union所在的作用域内该union的成员都是可以直接访问的。
对于union来说,要想构造或销毁类类型的成员必须执行非常复杂的操作,因此我们通常把含有类类型成员的union内嵌在另一个类中。这个类可以管理并控制与union的类类型成员有关的状态转换。
七.局部类
类可以定义在函数的内部,我们称这样的类为局部类。局部类定义的类型只在定义它的作用域可见。局部类的所有成员(函数在内)都必须完成定义在类的内部。局部类不允许声明静态成员。
局部类只能访问外层作用域定义的类型名、静态变量以及枚举成员。
八.固有的不可移植的特性
为了支持低层编程,C++定义了一些固有的不可移植的特性。所谓不可移植是指因机器而异。
类可以将其非静态成员定义为位域,在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递而二进制数据时,通常会用到位域。
位域在内存中的布局是与机器相关的。
位域的类型必须是整型或枚举类型。通常是无符号类型。位域的声明形式是在成员名字之后紧跟一个冒号以及一个常量表达式,该表达式用于指定成员所占的二进制位数。
取地址运算符不能作用于位域,因此任何指针都无法指向类的位域。
当对象的值可能在程序的控制或检测之外被改变时,应该将该对象声明为volatile。关键字volatile告诉编译器不应对这样的对象进行优化。
volatile的确切含义与机器有关,只能通过阅读编译器文档来理解。
就像一个类可以定义const成员函数一样,它也能将成员函数定义为volatile的。只能volatile的成员函数才能被volatile的对象调用。
和const一样,我们只能将一个volatile对象的地址赋给一个指向volatile的指针。对引用也一样。
我们不能使用合成的拷贝/移动函数及赋值运算符初始化volatile。
C++使用链接指示指出任意非C++函数所用的语言。
对于使用链接指示定义的函数来说,它的每个声明都必须使用相同的链接指示,指向其他语言编写的函数的指针必须与函数本身使用相同的链接指示。
指向C函数的指针和指向C++函数的指针是不一样的类型,不能混用。
当我们使用链接指示时,它不仅对函数有效,而且对作为返回类型或形参类型的函数指针也有效(即若它的形参或返回类型是函数指针的话,则也是那种语言的函数指针)。所以如果我们希望给C++函数传入一个指向C函数的指针,则必须使用类型别名。
有时需要在C和C++中编译同一个源文件,为了实现这一目的,在编译C++版本的程序时预处理器定义__cplusplus。利用这个变量,我们可以在编译C++程序的时候有条件地包含进来一些代码。
完结撒花!!!🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉
相关文章:
第十九章:特殊工具与技术
第十九章:特殊工具与技术 对于很多程序员来说,他们很少会用到本章的介绍的内容。 一.控制内存分配 我们能够重载new和delete,但其实不是对new和delete的重载,只是对new和delete操作符后面的函数进行重载。 当我们使用一条new表…...

大数据深度学习卷积神经网络CNN:CNN结构、训练与优化一文全解
文章目录 大数据深度学习卷积神经网络CNN:CNN结构、训练与优化一文全解一、引言1.1 背景和重要性1.2 卷积神经网络概述 二、卷积神经网络层介绍2.1 卷积操作卷积核与特征映射卷积核大小多通道卷积 步长与填充步长填充 空洞卷积(Dilated Convolution&…...

RabbitMQ(九)死信队列
目录 一、简介1.1 定义1.2 何时进入死信队列?1.3 死信消息的变化1.4 死信队列的应用场景1.5 死信消息的生命周期 二、代码实现2.1 死信队列的配置步骤2.2 配置类2.3 配置文件2.4 生产者2.5 业务消费者2.6 死信消费者2.7 测试结果 三、总结四、补充4.1 启动报错 ineq…...

KEI5许可证没到期,编译却出现Error: C9555E: Failed to check out a license.问题解决
一、编译出现如下报错 二、检查一下许可证 三、许可证在许可日期内,故应该不是许可证的问题 四、检查一下编译器,我用的是这个,这几个编译器的区别其实我不太明白,但我把问题解决是选的这个 五、找到编译器的路径,去复…...

南京观海微电子----时序图绘制工具
Wavedrom 是一款功能强大且简单易用的文本转图表工具,被广泛应用于生成时序图、波形图等交互式波形。其特点在于使用简单的文本语法,使得开发人员能够以可视化的方式表示数字信号和时间序列数据。Wavedrom 的优势在于其高度灵活性和可扩展性,…...

Gin CORS 跨域请求资源共享与中间件
Gin CORS 跨域请求资源共享与中间件 文章目录 Gin CORS 跨域请求资源共享与中间件一、同源策略1.1 什么是浏览器的同源策略?1.2 同源策略判依据1.3 跨域问题三种解决方案 二、CORS:跨域资源共享简介(后端技术)三 CORS基本流程1.CORS请求分类2.基本流程 四、CORS两种…...
TS:.d.ts 文件 和 declare 的作用
1 declare 做外部声明1.1 声明外部类型1.2 声明外部模块1.2.1 解决引入资源模块报错1.2.2 跳过对第三方库的类型检查 1.3 声明外部变量1.4 声明外部命名空间(作用域) 2 .d.ts 文件做外部声明3 declare global {} 在模块中做外部声明 先说一下我对 .d.ts文…...
JavaScript-jQuery2-笔记
1.获取元素文本、属性、内部结构、表单中的值 获取标签中所夹的文本内容:text() 获取标签的属性值:prop(属性名) 获取表单元素的内容:如 文本框中的内容 val() 获取元素的内部html结构:html() 2.筛选选择器 筛选选择器࿱…...
设计模式之多线程版本的if------Balking模式
系列文章目录 设计模式之避免共享的设计模式Immutability(不变性)模式 设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式 设计模式之避免共享的设计模式Copy-on-Write模式 设计模式之避免共享的设计模…...
mybatis核心配置文件介绍
mybatis核心配置文件 1. properties配置介绍 properties标签:加载外部的资源配置文件 属性:resource 指定要引入的配置文件路径 在核心配置文件中,通过:${key}方式引入外部配置文件的数据 jdbc.peroperties 的文件内容…...

Linux完全卸载Anaconda3和MiniConda3
如何安装Anaconda3和MiniConda3请看这篇文章: 安装Anaconda3和MiniConda3_minianaconda3-CSDN博客文章浏览阅读474次。MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包&…...
Apache Answer,最好的开源问答系统
Apache Answer是一款适合任何团队的问答平台软件。无论是社区论坛、帮助中心还是知识管理平台,你可以永远信赖 Answer。 目前该项目在github超过10K星,系统采用go语言开发,安装配置简单,界面清洁易用,且开源免费。项目…...
【C】内存分配
首先,回顾一下内存分配。所有程序都必须预留足够的内存来存储程序使用的数据。这些内存中有些是自动分配的: float x; int place[100]; 这些声明预留了足够的空间,还为内存提供了一个标识符,可以使用x或place识别数据。 1、mal…...

MySQL 从零开始:03 基本入门语句
文章目录 1、连接数据库1.1 命令提示符登陆1.2 MySQL 8.0 Command Line Client 登陆1.3 MySQL Workbench 登陆 2、基本语句2.1 查看所有库2.2 创建库2.3 删除库2.4 选择数据库2.5 查看表2.6 创建表2.7 删除表2.8 改表名2.9 清空表 在上一小节中介绍了 MySQL 数据库的安装&#…...

井盖异动传感器,守护脚下安全
随着城市化进程的加速,城市基础设施的安全问题日益受到关注。其中,井盖作为城市地下管道的重要入口,其安全问题不容忽视。然而,传统的井盖监控方式往往存在盲区,无法及时发现井盖的异常移动。为此,我们推出…...

复合机器人作为一种新型的智能制造装备高效、精准和灵活的生产方式
随着汽车制造业的快速发展,对于高效、精准和灵活的生产方式需求日益增强。复合机器人作为一种新型的智能制造装备,以其独特的优势在汽车制造中发挥着越来越重要的作用。因此,富唯智能顺应时代的发展趋势,研发出了ICR系列的复合机器…...

重置 Docker 中 Gitlab 的账号密码
1、首先进入Docker容器 docker exec -it gitlab bash 2、连接到 gitlab 的数据库 需要谨慎操作 gitlab-rails console -e production 等待加载完后会进入控制台 ------------------------------------------------------------------------------------------------------…...
任务类型划分
以下内容来自于ChatGPT内存密集型应用和IO密集型应用是两种不同类型的计算应用,它们在资源需求和性能特点上有所不同。 内存密集型应用(Memory-Intensive Applications): 特点: 这类应用主要依赖大量的内存资源来执行任…...

docker搭建部署mysql并挂载指定目录
Docker是一种轻量级、可移植的容器化平台,可以简化应用程序的部署和管理。在本文中,我们将探讨如何使用Docker来搭建和部署MySQL数据库,并将数据和配置文件挂载到外部目录,以实现数据持久化和方便的配置管理。 1: 安装Docker 首…...

即将推出的 OpenWrt One/AP-24.XY:OpenWrt 和 Banana Pi 合作路由器板
OpenWrt开发人员正在与Banana Pi合作开发OpenWrt One/AP-24.XY路由器板。OpenWrt 是一个轻量级嵌入式 Linux 操作系统,支持近 1,800 个路由器和其他设备。然而,这将是第一块由 OpenWrt 直接开发的路由器板。 该主板将基于 MediaTek MT7981B (Filogic 82…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...