- 博客(84)
- 收藏
- 关注
原创 [C++面试] explicit关键字面试点总结
explicitGoogle C++规范建议所有单参数构造函数必须加explicit,除非明确需要隐式转换(如从构造)。
2025-04-05 23:17:17
700
原创 C++书籍推荐1:C++进阶心法
书籍以C语言基础为起点(如指针、数组、volatile关键字等),逐步深入C++核心机制,包括内存管理、面向对象编程、异常处理、C++11/14新标准(如右值引用、移动语义)等。个人觉得,有一定的深度,但存在极少部分内容的准确性待商榷。可以看看作者列出的点,加深、巩固。《C++进阶心法》由吕吕、王琥合著,北京航空航天大学出版社于2019年出版。
2025-04-05 17:56:05
79
原创 [C++面试] 如何在特定内存位置上分配内存、构造对象
new面试-高阶题(可以主动讲给面试官),适用于内存池、高性能场景或需要精确控制内存布局的编程需求。
2025-04-05 16:15:52
576
原创 [C++面试] 智能指针面试点(重点)续4
允许转换的方向unique_ptr→shared_ptr(通过移动语义)。禁止转换的方向shared_ptr→unique_ptr之间仅允许右值移动赋值;unique_ptr可通过右值(如std::move或临时对象)赋值给shared_ptr,但左值不行。
2025-04-01 23:13:04
356
原创 [C++面试] 智能指针面试点(重点)续3
reset()在中,其核心作用是 释放当前管理的资源(若存在),并可以选择绑定新的资源。step1:若unique_ptr当前持有资源(即非空指针),调用reset()会立即通过delete或自定义删除器释放该资源step2:若reset()接受参数(如),则释放旧资源后,unique_ptr会接管新资源的所有权// 释放原资源(int(4)),绑定新资源(int(20))// 初始绑定资源(值为4的int对象)// 释放资源并置空,不再绑定任何资源执行后状态,表示无资源绑定。原资源。
2025-03-30 23:46:02
957
原创 [C++面试] 智能指针面试点(重点)续2
[C++面试] RAII资源获取即初始化(重点)-优快云博客[C++面试] 智能指针面试点(重点)-优快云博客[C++面试] 智能指针面试点(重点)续1-优快云博客智能指针(如和)不支持直接的加减操作。这是因为智能指针的设计目标是安全地管理资源所有权,而非像原始指针那样进行内存地址的算术运算。五法则(Rule of Five)是指:当一个类需要自定义析构函数、拷贝构造函数或拷贝赋值运算符时,通常也需要自定义移动构造函数和移动赋值运算符 是一种独占式智能指针,同一时间只能有一个 指向某个对象。为了保证
2025-03-30 11:52:15
994
原创 [C++面试] 智能指针面试点(重点)续1
默认删除器:使用delete释放对象,无法处理非堆内存(如文件句柄)。自定义删除器:可释放任意资源(如文件、网络连接),且不影响引用计数的线程安全。// 自定义删除器释放文件句柄});
2025-03-29 11:44:16
1093
原创 [C++面试] 智能指针面试点(重点)
C++面试] RAII资源获取即初始化(重点)-优快云博客智能指针是一种类模板,用于管理动态分配的内存,能在对象生命周期结束时自动释放内存,避免内存泄漏。在传统的 C++ 中,使用new分配内存后,必须手动使用delete释放,若忘记或在异常情况下未执行delete,就会导致内存泄漏。而智能指针利用 C++ 的 RAII(资源获取即初始化)技术,在对象构造时获取资源,在析构时释放资源,大大提高了代码的安全性。// 当 ptr 离开作用域时,内存会自动释放return 0;
2025-03-27 23:45:09
1028
原创 [C++面试] RAII资源获取即初始化(重点)
RAII(Resource Acquisition Is Initialization,资源获取即初始化)是 C++ 的核心编程范式,核心思想是 。
2025-03-26 23:18:27
1086
原创 [C++面试] span<char>和string_view的差别
2、string_view 仅限字符类型,隐式假设数据为字符串(如自动处理空终止符) 提供字符串专用方法,如 (截取子串)、(查找字符 / 子串)、(判断是否以某子串开头)等,完全围绕字符串语义设计,适合字符串处理 存储指针和字符数,可能包含空终止符标记 可能因隐式空终止符导致边界检查开销 因隐式绑定字符类型,可能因误用非字符串数据(如二进制数据)导致未定义行为3、span 无类型限制,需显式指定数据类型,支持泛型编程(如处理二进制缓冲区) 提供通用序列操
2025-03-26 21:35:00
498
原创 [C++面试] 你了解视图吗?
它提供了对序列(如数组、容器等)的非拥有性、只读或可写的访问。(就像是个透明的放大镜,它能让你去看一组数据,但它自己不拥有这些数据。避免数据的复制,提高性能。提供统一的接口来处理不同类型的序列。实现延迟计算,只有在需要时才进行实际的数据处理。// 创建一个视图,它是对numbers向量的一个抽象表示return 0;在这个例子中,创建了一个视图,它包含了numbers向量中的所有元素。通过视图可以遍历这些元素,而不需要复制数据。继承类,以确保视图符合视图的接口要求。
2025-03-25 23:20:43
856
原创 [C++面试] 迭代器面试点(难点)
需要定义迭代器类,并实现一些必要的操作符重载,如++==!等。// 自定义容器类private:T* data;int size;public:// 自定义迭代器类private:T* ptr;return ptr!it!
2025-03-20 23:34:31
746
原创 [C++面试] 关于deque
底层由多个固定大小的缓冲区组成,通过“中控器”(通常是一个指针数组)管理这些缓冲区的地址。的随机访问需通过中控器定位到具体缓冲区,再计算元素在缓冲区内的偏移,多了一层间接寻址;由多个固定大小的缓冲区组成,通过中控器(指针数组)管理。在中间插入/删除元素:可能导致后续元素的迭代器失效(需移动元素)。,支持在头部和尾部高效插入/删除元素,同时允许随机访问。直接通过连续内存的基地址+偏移量访问,无需额外查找步骤。在插入/删除元素时,所有后续迭代器均失效;仅在涉及缓冲区重新分配时影响部分迭代器。
2025-03-16 23:42:52
938
原创 [C++面试] 对通透比较器了解多少?(较少涉及,可跳过)
在 C++ 中,比较器是一个可调用对象(函数、函数对象或 Lambda 表达式),用于定义元素之间的比较规则。用途:通常作为参数传递给标准库中的排序函数或关联容器,以指定元素的顺序。// 使用 Lambda 表达式作为比较器进行降序排序});Lambda 表达式作为比较器传递给std::sort函数,用于定义降序排序规则。// 定义自定义比较器函数对象public:public:int age;// 使用自定义比较器进行排序return 0;
2025-03-11 23:22:39
359
原创 [C++面试] 迭代器与指针有什么区别?
迭代器:一种抽象概念,是为了统一对不同容器的访问方式而设计的,它是容器提供的一种接口。迭代器适用于所有标准库容器,如。元素是以位的形式存储的,不能直接对单个位进行常规的指针操作,因此普通的指针无法直接作为。指针:一种内置的数据类型,直接指向内存地址;指针主要用于操作数组或动态分配的内存块;元素分配一个字节(8 位)的内存空间,而是采用位压缩的方式。为了节省内存,不会像普通的。操作符来访问对象的成员。
2025-03-08 16:02:04
442
原创 char data[len_row][len_col]能直接讲data传递给char **吗?
数组名会 “退化” 为指向其首元素的指针。也就是 char (*)[len_col]。而不是char **如果传入的是 char *arr[10];类型传递给相应函数,因为它可以理解为是指向。
2024-12-28 10:36:16
161
原创 C++杂记
可以在类中重载该运算符,就可以像使用函数一样使用对象。只要重载了(),这个类就叫函数对象(可调用对象)1、() —— 函数调用运算符。
2024-12-28 09:57:11
225
原创 lambda初探2:与函数对象的区别
1、lambda表达式不需要显式定义一个类。它在编译期由编译器自动生成一个闭包类,在运行时由这个闭包类产生一个对象。
2024-12-21 18:37:20
116
原创 lambda初探(一)
退出lambda表达式后,foo外层的值不变化。foo内部的x,值是持续的,像static。即使退出foo函数后,值的状态依然保持。foo运行了两次,内部x的值,也变化了两次。外层x的值变化,并不影响foo内部。发生捕获时,拿到x,y的值。
2024-12-21 09:53:06
303
原创 RAII 资源获取即初始化
3、典型应用:智能指针、容器等(unique_lock、lock_guard)1、在构造函数中初始化资源。2、在析构函数中释放资源。
2024-08-15 22:45:36
152
原创 atomic
能用原子解决的,用互斥量也可以解决(m_mutex.lock();原子操作的效率要更高一点。一般:++、--、+=、-=、&=、|=、^=等简单运算符的运算是原子的,其他的一些复杂表达式的运算就不一定是原子的了。
2024-08-15 21:56:25
120
原创 如何从线程返回结果?
std::async具有不确定性。系统如果决定延迟运行(std::launch::deferred),则std::async创建的任务不会立即执行。可以看出,std::async与std::thread的主要区别在于:当系统资源紧张时,调用std::thread有可能导致线程创建失败,程序崩溃。如果不需要拿到返回值。std::packaged_task类模板,把各种可调用对象包装起来,方便给线程入口函数调用。std::async —— 函数模板,启动一个异步任务,返回一个std::future对象。
2024-08-14 23:31:08
421
原创 Cpp模板-template、typename(二)
T —— 类型参数,也叫模板参数 中包括两种类型参数:用typename/class修饰的是类型模板参数,是类型说明符。另外的称为非类型模板参数。与函数模板一样,非类型参数不允许使用浮点型、类对象(对象的引用可以)、void。
2024-06-02 18:34:41
515
原创 Cpp模板-template、typename(一)
2、template 为了与定义类的class区分,用typename来定义类型参数。T可以随便用其他占位符。模板参数名的作用域仅限于函数模板范围内,且每个模板参数要在函数的形参列表中至少出现一次。——《C++面向对象程序设计(杜茂康)》C7。1、模板是类型安全的。
2024-05-30 23:54:23
334
原创 5-29 宏的要点
4、尽可能使用const变量,而不是宏常量。2、简单宏性能优于常规函数调用。3、宏不支持任何形式的类型安全。1、宏函数可以减少代码行。
2024-05-29 23:48:34
152
原创 多态 polymorphism
1、没有继承关系的类,分配完内存后,优先给虚表指针赋值,再列表初始化,再构造函数。有继承关系的类,分配完内存后,先基类构造,后续同上。2、将函数声明(只能是类中的)为虚函数。告诉编译器,调用复函的版本。将子类对象视为父类,并执行子类的函数实现。
2024-05-26 23:46:42
144
原创 5-26 Cpp学习笔记
继承层次结构外,也不能通过子类实例访问基类的成员。在继承层次结构中,子类的子类能访问Base类的public、protected。:base类的public、protected,只能被Derived类使用,而无法通过Derived实例来使用。6、避免切除问题(类的截断),不要按值传递参数,以指向基类的指针或者const引用的方式。1、如果子类实现了基类的函数,返回值、参数都相同,就覆盖了基类的函数。8、final —— 不能用做基类,禁止被继承。无论什么继承,子类都不能访问父类的私有成员。
2024-05-26 21:49:11
469
原创 friend:函数、类
main函数中可以直接通过调用DisplayAge函数去访问Human的私有成员。DisplayAge是一个全局函数。声明类是自己的朋友,朋友就可以访问私有成员。—— 《21天学通C++》
2024-05-20 23:54:04
305
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人