- 博客(47)
- 收藏
- 关注
原创 C++面试题总结
STL包含六大组件:容器、算法、迭代器、仿函数、空间置配器、适配器。对 vector、deque 或 list 进行封装。常用的有:sort、reserve、sum、find。存放全局及静态变量,又分为两块。1. c++ 内存模型。
2025-03-22 17:24:46
276
原创 54. c++类型转换
c++是强类型语言,它有自己的类型系统,隐式类型转换时在类型转换是类型自动转换且数据不丢失,显示类型转换是指定转换类型;在c风格的类型转换中 ,如下代码进行转换。优点是有编译和运行时检查,减少强制类型转换时意外错误,如类型不兼容等;还能够根据名称搜索何处使用了类型转换(c风格的转换无法搜索),但一般来说,能不用就不用,容易导致 未定义行为(UB),const_cast会在后续学习中描述。其中dynamic_cast需要 父类中有虚函数,因为。
2025-02-19 17:54:14
294
原创 53. 虚析构函数
在前面的学习中‘17 构造与析构函数’及‘18 继承’中描述了虚函数和析构函数,这里我们学习一下虚析构函数,以下是在继承关系中,不同构造对象的方式及析构结果。
2025-02-19 16:19:20
394
原创 52. 类型双关&union
可以看到,类型双关的操作先把一个int类型指针转为double类型指针,然后解引用。结果是在原来的int内存之后继续了4个字节,然后获取整个内存,结果打印的地址并不理想,有可能造成崩溃,这样的类型双关操作不安全。需要做的就是将原来的指针转换为另一个类型的指针(结构体e的指针转化为数组的起始指针),然后作为另一种类型去访问它(作为数组类型去访问)。union关键字使得不同类型成员变量共享同一块内存,这运用了类型双关的概念。可以看到我们能够自如的操作c++的内存,
2025-02-19 11:35:37
405
原创 50. c++多维数组
在‘19 数组’中描述了原生数组的本质和其索引的原理,数组是连续的一个内存块,本质就是指针,指向这个内存块的起始位置,索引的原理就是对该指针的操作。通常对数组的操作一种策略就是使用指针,二维数组可以说是数组的数组,第二维数组存储了每个指向第一维数组的指针,并可以对其进行操作。在堆上创建的数组内存不连续,程序效率较低,若一维数组可以满足需求,优先选择一维数组。
2025-02-16 20:41:32
152
原创 49. c++计时器
为了测试某段特定代码的执行时间,体现代码的性能,可以使用计时器对代码段计时。对于实际执行基准测试来说,这个方法还是比较粗略的,后续的学习中会继续描述具体在vc工具中基准测试、性能测试的方法。
2025-02-16 11:03:21
241
原创 48. c++线程
c++多线程实现使用标准库中的<thread>,一下代码描述多线程实现方式 ,最简单的线程创建方式是通过传递一个可调用对象(如函数指针、函数对象或 Lambda 表达式)
2025-02-14 17:27:38
364
原创 47. using namespace
两个命名空间都有同名函数print时,编译并不会报错,但运行时可能就会出现意外结果。此外使用std命名空间时,相关的标准库下的代码可读性降低,不易分辨string所属。尤其是在大型项目中,使用namespace会包含进来许多函数,容易造成混乱。因此避免使用namespace。
2025-02-12 22:07:34
117
原创 46. lambda表达式
lambda是定义匿名函数的方式,在‘45. 函数指针’中提到了lambda的使用,只要是需要使用函数指针的地方(如传入函数指针作为形参时)都可以使用lambda表达式编写。捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量。[&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量。
2025-02-12 16:52:03
742
原创 45. c++函数指针
在‘12 指针’中描述了指针的本质,就是一个内存地址(一串数字)。函数在编译时会被编译为cpu指令,然后存储在可执行文件exe中。而函数指针就是这些指令的地址,是将一个函数赋值给一个变量。
2025-02-12 15:37:42
140
原创 44. std::array(静态数组)
vector是一个动态增长的数组,而array的大小一开始要给定一个值,不能动态增长,又称为静态数组;vector内存分配在堆上,array在栈上。‘35. c++动态数组std::vector’ 中介绍了vector的内容,它是标准模板库STlL的一部分。因此原始数组和array两者中优先选用array使用,它有更多api,且它的内存地址连续,速度也比较快。查看array源码可以看到,它是一个模板类,数组大小size就是一个模板参数。
2025-02-12 11:19:28
171
原创 43. auto关键字
在实际开发场景中,会用到较长的类型,如下的vecotr迭代、map获取等,此时使用auto就可以大大减少类型长度简化代码;当然也有别的方式,如使用using、typedef定义类型,但相比auto来说,需要重新定义,并不是最优的方法。当然也存在一些问题,改变函数返回类型后,调用处所依赖的具体的api,此时代码就会被破坏;当鼠标悬停到name变量上时显示类型为std::string,auto的优点在于当需要改变功能函数返回类型时,无需二次更改调用代码。注意:使用auto接受类型时,加上引用&避免产生复制。
2025-02-12 10:08:44
299
原创 42. c++宏
宏的定义使用#define ,在预处理过程中会把使用宏的地方替换为定义的具体内容,这与‘40. c++模板’中描述的模板有区别,模板是在调用的时候才会实际生产,而宏是在预处理时期进行替换。下面是一个简单的宏使用案例。具体的使用,如在日志系统中,针对不同的开发模式需要记录不同的内容,下面演示对于debug和release下使用宏完成不同日志内容的记录。在代码中分别对PR_DEBUG为不同值时进行日志打印。这样使用宏LOG时会在不同模式下记录不同的日志内容。release模式下,则执行另外的日志。
2025-02-11 16:31:19
119
原创 41. c++栈和堆内存的比较
应用程序启动后,操作系统会分配一些必要的内存空间供程序使用,其中堆和栈内存是主要关注的部分。在c++中,栈内存一般是预定义的内存区域,通常为2M字节大小;堆内存预定义了一个默认的区域,但大小可以增长随应用程序的进行改变。二者的工作方式不同,尤其是分配内存的方式。以如下代码为例,进行详述。
2025-02-10 17:33:20
156
原创 40. c++模板
模板是c++中泛型编程的基础,是c++支持参数化多态的工具,stl也是基于模板实现的。将类或函数声明为一种通用的模式,实现一个功能函数满足任意类型参数的需求。分为函数模板和类模板;
2025-02-10 14:31:44
198
原创 39. c++处理多返回值
通常函数接口只能返回一种类型,当我们需要返回多种类型时有一些方法可以参考。借助结构体返回多个不同类型的值,在get数据时也比较清晰。这种方式在取数据时对于参数名成不明确,造成代码混乱。如果多个类型相同时可以用数组。
2025-02-10 09:55:04
208
原创 postman使用简介
下载后可以打开界面,可以填入远端数据库地址,在body中填入要查询的dbname及key点击send即可查询。在使用非关系数据库,与远端数据库交互时,需要在本地测试程序逻辑。借助postman查询数据。绑定资源中,有如下应用程序,双击后可开启数据库服务。2、使用postman。
2025-02-08 14:14:33
289
原创 37. c++使用动态库
同时编译这两个文件是重要的,因为如果尝试使用不同的dll.lib,二者不对应那么在运行时连接dll会得到不配的函数和错误类型的内存地址,函数指针不会正常工作。这是因为静态库文件已经添加,所以编译没问题,而程序启动时链接不到静态库中所指向的函数,2、在可执行程序的目录下添加相应的dll文件。静态链接是在编译时发生的,将库中的内容都复制到了可执行文件中,经过了编译器和链接器的执行流程,会发生优化;‘36 c++使用静态库’中描述了静态库的使用方法,这里将描述动态库的使用。添加后执行成功打印结果 1。
2025-02-08 13:57:43
292
原创 36. c++使用静态库
链接的过程分为静态链接和动态链接,静态链接意味着这个库会被写入可执行文件exe中,动态链接是在运行时被装载链接的,有一个loadLibrary()函数会载入动态库,调用函数;使用这个库时,需要在vs中添加外部库的依赖,右键工程properties,如下图,选择与库二进制文件对应的platform32位,然后添加库的相对路径。include中是头文件,声明了我们可以使用的函数,lib文件夹是链接时用到的库,定义了头文件中的函数,以供链接调用执行。
2025-02-07 17:09:49
390
原创 35. c++动态数组(std::vector)
vector在c++的标准模版库STL中,STL中包含了很多容器的数据结构,后面会详细描述。vector(向量)它其实是一个arraylist,并且数组大小是动态变化的。一般情况下元素不为指针时,它的内存时连续的。以下为vector简单使用例子,
2025-02-06 21:17:59
161
原创 34. 重载箭头操作符
创建指针对象时,我们通常会使用箭头操作符访问变量或函数,在某些情况下我们需要重载箭头操作符以便于变量或函数的访问。如下所示,在一个简单的作用域指针对象ScopedPtr中,想要访问Entity中的函数时,直接访问编译报错,要么还需要再添加一个getMObj(),这样会使得代码复杂混乱。利用箭头操作符得到变量的偏移量,当我们处理一些字节流等我们可以便利的查看它们的偏移量。想要想绿色框中一样简洁访问Entity中的函数,那么我们需要重载箭头操作符,如下。下面是一个箭头操作符的使用功能案例,
2025-02-06 17:10:32
173
原创 33. c++复制与拷贝构造函数
当我们执行复制操作时,两个字符串类对象指向了同一个mBuffer的内存地址,析构函数调用了两次,在释放内存时就会释放两次,导致程序崩溃。而我们真正要做的是给第二个字符串类对象分配一个新的char数组,来存储复制的字符串,而不是上面的浅拷贝,下面重写拷贝构造函数,实现深拷贝。使用另一种方式打印字符串,可以看出拷贝函数被执行了多次,这会导致新建多次内存,降低程序运行效率。因此为了优化程序,我们在编程时要使用const引用传参,避免产生深拷贝,降低效率。33.1 深拷贝与浅拷贝。33.2 字符串的拷贝。
2025-01-25 14:44:08
265
原创 QT使用httplib上传表单数据formdata
ImageFile 字段 为要上传的文件内容。2.1 将http url等相关配置到文件中。2.2 使用httplib接口,先引入头文件。
2025-01-24 16:47:58
162
原创 32. C++智能指针
原始指针new创建后,需要delete手动释放内存,智能指针能够实现自动化管理,它对原始指针进行包装,自动调用new分配内存,自动释放。下面描述几个智能指针。
2025-01-07 15:17:53
310
原创 c++基础学习1-32
因此为了更加方便的使用声明的函数,会将函数声明放入头文件中,cpp文件中存放头文件中声明的函数体。链接器会将所有的obj文件链接在一起,当然也可能会链接到c++运行时库等一些其他的外部信息,还分为静态链接和动态链接,将在后面的内容中详述。
2025-01-07 15:17:51
1110
原创 31. c++的对象生存期
createArr中创建的arr已经随着函数 createArr()结束而被销毁,虽然内存被销毁但创建的值还未被清除,此时访问还可以打印。但当再次使用栈创建变量时,如使用createArr2在栈上创建arr,此时a的值就被清除掉了。此外,由于栈上创建的变量仅在一定作用域内存在,所以日常编码中要注意避免栈的错误使用。利用栈在作用域中存在,离开作用域会自动析构被销毁的特性,我们可以写一个类似智能指针的功能,以下为简单案例。在c++中 栈上定义的变量只在作用域范围内存在,超出作用域将被销毁。
2025-01-04 16:58:31
209
原创 cmake添加新库
注意这里有将库的dll文件自动添加到运行目录下的命令,当其他人从git中拉取代码并编译后就无需手动将这个库的dll拷贝到运行目录下。在qt编码中,如果需要用到第三方库,那么我们需要下载相关库的源码,编译后使用到项目中。同时在cmake中进行相关配置,一下以一个qt中解压缩库quazip为例进行详述。
2024-12-18 16:26:34
161
原创 QT集成aws-cpp-sdk及开发S3接口
aws即Amazon Web Services,S3是aws提供的一种持久性、高可用性、可扩展的对象存储服务,用于检索和存储大规模的数据对象、如文件、图像、视频等;应用于数据存储和管理、备份和恢复、数据归档和大数据分析等多个领域,下面描述QT中S3接口的开发流程。
2024-10-28 17:53:18
639
4
原创 LeetCode两数之和
这里用了 std::unordered_map ,是因为它查找速度快,内部是哈希表。当遇到需要查询操作较多的情况,可以使用unordered_map,当需要排序时使用map。嵌套循环,第一层遍历取数组值,第二层遍历 计算和 找到目标.时间复杂度O(N2),空间复杂度O(1)但是,数组中同一个元素在答案里不能重复出现。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。一边找一边存储,时间复杂度O(N),空间复杂度O(N) [map中的哈希表]整数,并返回它们的数组下标。
2024-05-23 16:34:58
302
1
原创 opencv基础
参数的使用影响检测结果。将一组图片水平排列进行拼接,所有图片的宽度之和作为拼接结果图的长,所有图片中最大的长作为结果图的宽。通过trackbar来调整阈值,观测目标颜色的选中情况,从而选定最值(注意,目标要以白色为准)。关键在于像素点的选取、旋转矩阵的应用及warpPerspective()函数的使用。黑框中持续打印滑动条的选值,选出颜色笔后便可使用打印出的hsv最大最小值;关键在于hsv三类最值的选取以及inRange()函数的使用;先选定颜色的阈值:ColorPicker;其中:点排序前后如下。
2023-11-21 18:01:00
99
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人