hpp文件的使用

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、过程
    • 2.1 编写代码
    • 2.3 问题探究
  • 总结

前言

前期疑问:
本文目标:


一、背景

最近突然看到hpp文件,查了百度也没有hpp文件怎么写的说明,自己就试着写了下,写成功了。

而且基于写hpp文件还串联了其他的知识点。下面整理一下测试代码

二、过程

2.1 编写代码

// main.cpp文件

#include <cstdio>
#include "hppTest.hpp"void TestMemory(HppTest &hppTest)
{for (unsigned int i = 0; i < 1000; i++) {char* str = hppTest.hppTestGetStr();printf("%d, %s\n", i, str);}
}void TestMemory2()
{for (unsigned int i = 0; i < 100; i++) {HppTest hppTest;char* str = hppTest.hppTestGetStr();printf("%d, %s\n", i, str);}
}void TestCopyConstruct(HppTest& hppTest)
{/** 报错Call to deleted constructor of 'HppTest'* 'HppTest' has been explicitly marked deleted here* 这边报错hppTest对象不能被拷贝构造。从报错语句跳转到类中,* 跳转到HppTest(const HppTest &x) = delete;语句,* 也验证了HppTest hppTest2 = hppTest;写法是调用拷贝构造函数,因为hppTest2还不存在*/HppTest hppTest2 = hppTest;             //拷贝构造函数/** 报错Overload resolution selected deleted operator '='* candidate function has been explicitly deleted* 根据错误跳转到HppTest& operator = (const HppTest &x) = delete;语句、* 也验证了hppTest3 = hppTest;是调用赋值构造函数*/HppTest hppTest3;hppTest3 = hppTest;
}int main()
{printf("hppTest\n");HppTest hppTest;int num = hppTest.hppTestFunc();printf("num: %d\n", num);// 构造内存泄露的情况,但是没有成功,原因是我的申请内存是在实例化对象的时候申请的,// 在for循环中并不会再次申请,同样就不会释放,for循环多少次都是一样的。修改成代码TestMemory2TestMemory(hppTest);// 在for循环中实例化对象,不断申请内存释放内存/** 按照预期内存泄露,运行第6次就内存泄漏了。基于析构函数中delete被注释* terminate called after throwing an instance of 'std::bad_alloc'* what():  std::bad_alloc* 下面放开析构函数中的delete释放内存代码,再次验证* 执行1000次也没内存泄露,所以hpp中的析构函数有作用,析构函数中的delete释放内存有作用。*/TestMemory2();TestCopyConstruct();return 0;
}

// HppTest.hpp文件

#ifndef TESTPROJ_LOCAL_WITHOUT_LIBRARY_HPPTEST_H
#define TESTPROJ_LOCAL_WITHOUT_LIBRARY_HPPTEST_H#include <stdlib.h>
#include "string.h"class HppTest {
public:HppTest() : num(16), array(nullptr){//array = (char*)malloc(sizeof(char) * 15);array = new char[1500000000];}~HppTest(){delete[] array;printf("array is released\n");}// 禁止复制构造函数HppTest(const HppTest &x) = delete;HppTest &operator=(const HppTest &x) = delete;int hppTestFunc(){return num;}char* hppTestGetStr(){memcpy(array, "hello world", sizeof(char) * 15);return array;}private:int num;char* array;
};#endif //TESTPROJ_LOCAL_WITHOUT_LIBRARY_HPPTEST_H// 上述代码写的过程中遇到的几个问题
/** 1、new申请空间的写法不知道* 2、在纠结hpp文件要不要写析构函数,答案是可以写的* 3、完全不知道怎么写拷贝构造函数和复制构造函数。* 4、照着自己写的文章写了拷贝构造函数和复制构造函数,写了=delete禁用,但是也写了花括号,报错了,正确的是写了=delete就不要写花括号了* 5、写禁止拷贝的原因是类中有指针。但是是否是这样还需要确认一下。* 6、想验证一下hpp文件的类的析构函数和内存释放是否有用描写了测试函数TestMemory和TestMemory2,从TestMemory函数到TestMemory2函数也加深了理解* 7、验证写了禁用拷贝、复制构造函数后,是否会禁用拷贝和赋值,经过TestCopyConstruct函数演这个,确实禁用了拷贝和赋值构造函数。* 8、c++初始化列表跟在构造函数后面,多个成员使用初始化李彪初始化时,使用【,】连接。*/

// cmakelist.txt文件

include_directories(hppTest/HppTest.hpp)
add_executable(hppTesthppTest/main.cpp)

上述代码运行结果【前提要把TestCopyConstruct函数注释掉,因为调用了拷贝赋值构造函数】

hppTest
num: 16
0, hello world
1, hello world
2, hello world
...
...
998, hello world
999, hello world
0, hello world
array is released
1, hello world
array is released
2, hello world
array is released
...
...
98, hello world
array is released
99, hello world
array is released
array is released		

上面打印结果中最后一个array is released是因为释放main函数中的对象。

2.3 问题探究

// 上述代码写的过程中遇到的几个问题

/*

  • 1、new申请空间的写法不知道
  • 2、在纠结hpp文件要不要写析构函数,答案是可以写的
  • 3、完全不知道怎么写拷贝构造函数和复制构造函数。
  • 4、照着自己写的文章写了拷贝构造函数和复制构造函数,写了=delete禁用,但是也写了花括号,报错了,正确的是写了=delete就不要写花括号了
  • 5、写禁止拷贝的原因是类中有指针。但是是否是这样还需要确认一下。
  • 6、想验证一下hpp文件的类的析构函数和内存释放是否有用描写了测试函数TestMemory和TestMemory2,从TestMemory函数到TestMemory2函数也加深了理解
  • 7、验证写了禁用拷贝、复制构造函数后,是否会禁用拷贝和赋值,经过TestCopyConstruct函数演这个,确实禁用了拷贝和赋值构造函数。
  • 8、c++初始化列表跟在构造函数后面,多个成员使用初始化李彪初始化时,使用【,】连接。
    */

针对这个hpp文件的写法又收获了一波啊


总结

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NPU 可不可以代替 GPU

结论 先说结论&#xff0c;GPU分为可以做图形处理的传统意义上的真GPU&#xff0c;做HPC计算的GPGPU和做AI加速计算的GPGPU&#xff0c;所以下面分别说&#xff1a; 对于做图形处理的GPU&#xff0c;这个就和NPU 一样&#xff0c;属于DSA&#xff0c;没有替代性。当然&#xf…

java: 题目:银行账户管理系统

题目&#xff1a;银行账户管理系统 设计一个简单的银行账户管理系统。要求实现以下功能&#xff1a; 1. 创建一个银行账户 BankAccount 类&#xff0c;该类具有以下属性&#xff1a;accountNumber&#xff08;账户号码&#xff0c;类型为 String&#xff09; balance&#xff…

2024年无线领夹麦克风十大品牌推荐,衣领麦克风哪个品牌好

声音&#xff0c;是沟通的桥梁&#xff0c;是信息的载体。在信息爆炸的时代&#xff0c;如何让自己的声音脱颖而出&#xff0c;成为了每个人都需要思考的问题。无线领夹麦克风&#xff0c;以其小巧便携、无线传输的特点&#xff0c;成为了众多声音爱好者的首选。市场上无线领夹…

【C++的vector、list、stack、queue用法简单介绍】

【知识预告】 vector的介绍及使用list的介绍及使用list与vector的对比stack的介绍和使用queue的介绍和使用priority_queue的介绍和使用 1 vector的介绍及使用 1.1 vector的介绍 vector是表示可变大小数组的序列容器和数组类似&#xff0c;vector也采用连续存储空间来存储元…

杨传辉:云+AI 时代的一体化数据库|OceanBase发布会实录

在 2024 OceanBase 年度发布会 上&#xff0c; OceanBase CTO 杨传辉进行了主题为《云和 AI 时代的一体化数据库战略思考》的演讲&#xff0c;本文为演讲实录&#xff0c;欢迎阅读。 视频观看可点击&#xff1a;https://www.oceanbase.com/video/9001825 各位 OceanBase 的客…

[大模型]视频生成-Sora简析

参考资料&#xff1a; Sora技术报告https://openai.com/index/video-generation-models-as-world-simulators/4分钟详细揭密&#xff01;Sora视频生成模型原理https://www.bilibili.com/video/BV1AW421K7Ut 一、概述 相较于Gen-2、Stable Diffusion、Pika等生成模型的前辈&am…

【docker入门】docker的安装

目录 Centos 7 添加docker 官方仓库到yum源 将 Docker 的官方镜像源替换为国内可以的 Docker 镜像源 安装docker 配置docker加速源 Ubuntu 创建 gpg key 目录 下载 gpg key 添加国内可用镜像源到 系统的 APT 仓库中 安装docker 配置加速源 Centos 7 添加docker 官方仓…

2024年【汽车修理工(高级)】考试总结及汽车修理工(高级)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车修理工&#xff08;高级&#xff09;考试总结是安全生产模拟考试一点通总题库中生成的一套汽车修理工&#xff08;高级&#xff09;试题及解析&#xff0c;安全生产模拟考试一点通上汽车修理工&#xff08;高级&a…

vscode的一些使用心得

问题1&#xff1a;/home目录空间有限 连接wsl或者remote的时候&#xff0c;会在另一端下载一个.vscode-server&#xff0c;vscode的插件都会安装进去&#xff0c;导致空间增加很多&#xff0c;可以选择更换这个文件的位置 参考&#xff1a;https://blog.csdn.net/weixin_4389…

Qt(openCV的应用)

1. OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;它提供了丰富的图像处理和计算机视觉功能。该库由英特尔公司发起&#xff0c;并在 BSD 许可证下发布&#xff0c;因此它是免费的&#xff0c;且开放源代…

【大语言模型】ACL2024论文-06 探索思维链COT在多模态隐喻检测中的应用

【大语言模型】ACL2024论文-06 探索思维链COT在多模态隐喻检测中的应用 目录 文章目录 【大语言模型】ACL2024论文-06 探索思维链COT在多模态隐喻检测中的应用目录摘要研究背景问题与挑战如何解决创新点算法模型1. 知识总结模块&#xff08;Knowledge Summarization Module&…

Kubernetes中的statefulset控制器

华子目录 statefulset控制器功能StatefulSet的组成部分 问题复现示例statefulset示例总结 statefulset控制器 功能 Statefulset是为了解决有状态服务的问题设计的StatefulSet将应用状态抽象成了两种情况拓扑状态&#xff1a;应用实例必须按照某种顺序启动。新创建的Pod必须和…

【Android】时区规则库tzdata更新

1 背景&#xff1a; 最近我遇到墨西哥城时区&#xff0c;会出现夏令时&#xff0c;而墨西哥城在2022年底都已经取消夏令时了。 看起来是要更新RK3588上的时区库&#xff0c;我的还是2021a&#xff0c;而现在都已经2024年了 这样能看版本号&#xff1a; cat /system/usr/sha…

【论文速看】DL最新进展20241106-图像分类、图像分割、时间序列预测

目录 【图像分类】【图像分割】【时间序列预测】 【图像分类】 [2024 解耦数据增强] Decoupled Data Augmentation for Improving Image Classification 机构&#xff1a;腾讯优图 论文链接&#xff1a;https://arxiv.org/pdf/2411.02592v1 代码链接&#xff1a;无 最近在图…

[MRCTF2020]PYWebsite1

如果输入的密钥是对的那么我们就直接跳转到flag.php页面 那么我们直接访问&#x1f60e;&#xff0c;他不带我们去我们自己去. 那就用XFF呗. 知识点&#xff1a; 定义&#xff1a;X-Forwarded-For是一个HTTP请求头字段&#xff0c;用于识别通过HTTP代理或负载均衡方式连接到W…

穿越文化与时空的回响——从廖问洁《红豆诗词选》看当代人文情怀

穿越文化与时空的回响 ——从廖问洁《红豆诗词选》看当代人文情怀 在快节奏的现代生活中&#xff0c;我们时常感到身心的疲惫&#xff0c;渴望找到一种能够洗涤内心的方式。而廖问洁的《红豆诗词选》就如同一股清泉&#xff0c;为我们带来了心灵的洗礼和慰藉。 这位来自94年的…

【sqlmap使用手册-持续更新中】

SQLMap 简介 SQLMap 是一个开源的渗透测试工具&#xff0c;用于自动化检测和利用 SQL 注入漏洞。它支持多种数据库&#xff0c;包括 MySQL、PostgreSQL、Oracle、SQL Server 等。 可以通过以下命令安装sqlmap git clone https://github.com/sqlmapproject/sqlmap.git最常用的…

吉利极氪汽车嵌入式面试题及参考答案

inline 的作用 inline 是 C++ 中的一个关键字。它主要用于函数,目的是建议编译器将函数体插入到调用该函数的地方,而不是像普通函数调用那样进行跳转。 从性能角度来看,当一个函数被标记为 inline 后,在编译阶段,编译器可能会将函数的代码直接复制到调用它的位置。这样做…

详解Rust标准库:VecDeque 队列

theme: github highlight: an-old-hope 查看本地官方文档 安装rust后运行 rustup doc查看The Standard Library即可获取标准库内容 std::connections::VecDeque定义 队列是遵循先入先出规则的线性数据结构&#xff0c;在内存中不一定连续 VecDeque定义&#xff1a;可增长…

有哪些实用的 Ads Spy 工具推荐?

了解竞争对手的广告策略至关重要。Ads Spy 工具可以帮助我们洞察竞争对手的广告活动&#xff0c;从而优化自己的推广计划。以下是一些实用的 Ads Spy 工具介绍&#xff1a; 1. PowerAdSpy&#xff1a;可以按广告版位全渠道搜索筛选&#xff0c;实时在线筛查正在展示的广告&…