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.xdnf.cn/news/4889.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python: Parent-child form operations using ttkbootstrap

# encoding: utf-8 # 版權所有 2024 ©塗聚文有限公司 # 許可資訊查看&#xff1a;言語成了邀功的功臣&#xff0c;還需要行爲每日來值班嗎&#xff1f; # 描述&#xff1a; 主、子表單 窗體傳值 Parent-child form operations # Author : geovindu,Geovin Du 塗聚文. …

能让企业“脱胎换骨”的局域网电脑监控软件,有哪些?

老板们&#xff0c;是不是发现现在员工们在上班时间玩得那叫一个欢&#xff0c;而工作却被丢在一边&#xff1f;别愁啦&#xff01;今天就给各位带来一份超赞的局域网电脑监控软件指南&#xff0c;这就像是给企业配上了 “超级放大镜”&#xff0c;员工的一举一动都能看得清清楚…

什么是计算机视觉算法?——深度剖析背后的技术与应用

计算机视觉&#xff08;Computer Vision&#xff09;作为人工智能的重要分支&#xff0c;正在逐渐改变我们的生活。从人脸识别到自动驾驶&#xff0c;从医疗影像诊断到视频监控&#xff0c;计算机视觉的应用无处不在&#xff0c;而支撑这一切的正是计算机视觉算法。那么&#x…

产品如何3D建模?如何根据使用场景选购3D扫描仪?

随着科技的飞速发展&#xff0c;3D模型已从昔日的小众应用转变为各行各业不可或缺的利器。在文博、电商、家居、汽车、建筑及游戏影视等众多领域&#xff0c;3D模型以其直观、真实的视觉体验发挥着至关重要的作用。它不仅使用户能深入了解产品的外观、结构与功能&#xff0c;还…

信息安全工程师(79)网络安全测评概况

一、定义与目的 网络安全测评是指参照一定的标准规范要求&#xff0c;通过一系列的技术、管理方法&#xff0c;获取评估对象的网络安全状况信息&#xff0c;并对其给出相应的网络安全情况综合判定。其对象主要为信息系统的组成要素或信息系统自身。网络安全测评的目的是为了提高…

Windows 系统上配置 SSH 密钥验证,实现无密码登录

Windows 系统上配置 SSH 密钥验证&#xff0c;实现无密码登录 在日常工作中&#xff0c;使用密码登录远程云服务器往往让人感到繁琐。云服务器的密码通常较长&#xff0c;难以记忆&#xff0c;每次登录都需要反复输入&#xff0c;既不便捷也影响效率。此外&#xff0c;由于网络…

俯仰 (pitch) 偏摆 (yaw) 翻滚 (roll)

pitch()&#xff1a;俯仰&#xff0c;将物体绕X轴旋转&#xff08;localRotationX&#xff09; yaw()&#xff1a;航向&#xff0c;将物体绕Y轴旋转&#xff08;localRotationY&#xff09; roll()&#xff1a;横滚&#xff0c;将物体绕Z轴旋转&#xff08;localRotationZ&…

es数据同步(仅供自己参考)

数据同步的问题分析&#xff1a; 当MySQL进行增删改查的时候&#xff0c;数据库的数据有所改变&#xff0c;这个时候需要修改es中的索引库的值&#xff0c;这个时候就涉及到了数据同步的问题 解决方法&#xff1a; 1、同步方法&#xff1a; 当服务对MySQL进行增删改的时候&…

从0开始学习Linux——Yum工具

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 上一个章节我们简单了解了Linux中常用的一些文本编辑器&#xff0c;本次教程我们将学习yum工具。 一、Yum简介 Yum&#xff08;全名…

高级AI记录笔记(一)

学习位置 B站位置&#xff1a;红豆丨泥 UE AI 教程原作者Youtube位置&#xff1a;https://youtu.be/-t3PbGRazKg?siRVoaBr4476k88gct素材自备 提前将动画素材准备好 斧头蓝图 斧头武器插槽 混合空间 就是改了一下第三人称模版的动画蓝图 行为树中不用Wait实现攻击完…

ffmpeg的下载与安装

废话不多说&#xff0c; 下载地址&#xff0c;得找官网&#xff0c;不然得注意是不是有夹带私活。 FFmpeg 这个是目前的最新版本&#xff1b; 下载的时候看下自己要的版本&#xff0c;我的是Windows10&#xff1b; 解压后的版本长这样&#xff1a; 接下来进行环境变量的配置&…

【http协议笔记】-- 浏览器简单分析get、post请求

环境&#xff1a;为了了解http协议的交互方式&#xff0c;使用edge浏览器简单分析协议内容&#xff0c;给刚入门的小伙伴分享一下&#xff0c;方便大家学习。 以菜鸟教程的网站为例子&#xff1a; 分析post&#xff1a; 请求url&#xff1a; 请求参数&#xff1a; 请求相应&a…

SpringBoot【实用篇】- 热部署

文章目录 目标:1.手动启动热部署2.自动启动热部署4.禁用热部署 目标: 手动启动热部署自动启动热部署热部署范围配置关闭热部署 1.手动启动热部署 当我们没有热部署的时候&#xff0c;我们必须在代码修改完后再重启程序&#xff0c;程序才会同步你修改的信息。如果我们想快速查…

vue3相对vue2有哪些改变?

https://blog.csdn.net/weixin_44475093/article/details/112386778 https://blog.csdn.net/userDengDeng/article/details/114941956 一、vue3的新特性&#xff1a; 1、速度更快 vue3相比vue2 重写了虚拟Dom实现编译模板的优化更高效的组件初始化undate性能提高1.3~2倍SSR速度…

数据库概论实验一

声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 本文章对数据库概论实验一_求出一箱(每箱装100个)零件的重量 并将输出结果-CSDN博客文章浏览阅读2.7k次&#xff0c;点赞4次&#xff0c;收藏25次。实验数据库&#xff0c;表…

绿色能源发展关键:优化风电运维体系

根据QYResearch调研团队最新发布的《全球风电运维市场报告2023-2029》显示&#xff0c;预计到2029年&#xff0c;全球风电运维市场的规模将攀升至307.8亿美元&#xff0c;并且在接下来的几年里&#xff0c;其年复合增长率&#xff08;CAGR&#xff09;将达到12.5%。 上述图表及…

gerrit 搭建遇到的问题

1、启动Apache&#xff0c;端口被占用 : AH00072: make sock: could not bind to address (0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443 a AH00451: no listening sockets available, shutti…

栈和队列相关题 , 用队列实现栈, 用栈实现队列 ,设计循环队列 C/C++双版本

文章目录 1.用队列实现栈2.用栈实现队列3. 设计循环队列 1.用队列实现栈 225. 用队列实现栈 思路&#xff1a; 使用两个队列&#xff0c;始终保持一个队列为空。 当我们需要进行压栈操作时&#xff0c;将数据压入不为空的队列中&#xff08;若两个都为空&#xff0c;则随便压…

关于STM32在代码中的而GPIO里面的寄存器(ODR等)不需要宏定义的问题

1.GPIO为什么需要宏定义地址 在 STM32 这样的微控制器中&#xff0c;硬件寄存器的地址是固定的并且特定于每个外设&#xff08;比如 GPIOA、GPIOB 等&#xff09;。为了方便代码访问这些硬件寄存器&#xff0c;我们通常会使用宏定义来指定每个外设的基地址。这样做有几个理由&a…

kimi智能助手,5大高阶玩法,95%的人还不知道

01 智能搜索:精准定位,一键获取最佳答案 Kimi,作为您的AI助手,拥有卓越的网络搜索能力。 我们能够迅速穿梭于信息海洋,为您筛选出五篇精选网络文章,并提供直接的网址链接。 Kimi的总结能力同样出色,特别适合那些追求效率、不愿深陷长篇文章的用户。 02 PDF速读:快速把…