- 博客(181)
- 问答 (4)
- 收藏
- 关注
原创 c++ 之模版实例化
它的 foo<int>的具体定义就是编译器生成的、针对int} // 这就是 foo<int> 的“具体定义”而我们通过显式实例化定义(explicit instantiation definition)// 显式实例化定义:生成 foo<int> 的具体代码这行代码不是声明,而是命令👉 “编译器,请现在就为foo<int>生成实际的函数体!// foo.h// foo_inst.cpp ← 只能有一个这样的文件!// 👇 这就是“具体的定义”!// 生成 foo<int>
2025-10-16 00:18:28
563
原创 STL 之vector 类模版
标准库不是“黑盒”,而是 C++ 设计智慧的教科书。通过分析vector和shared_ptr模板参数设计(类型参数、策略参数)嵌套类型(支持泛型算法)值语义 vs 引用语义RAII 与资源管理类型擦除(shared_ptr删除器)异常安全与移动语义下一步:尝试自己设计一个模板类(如或),应用这些原则。如果你希望我提供MyVector或的完整教学实现,欢迎告诉我!
2025-10-16 00:09:56
816
1
原创 c++ Effective 条款33
名称掩盖是C++的规则:派生类中同名函数会掩盖基类中所有同名函数(无论是否virtual,无论参数是否匹配)。这可能导致你无法调用基类的重载函数。使用可以显式地将基类的函数引入派生类作用域,从而恢复重载行为。这个规则有时会让初学者感到困惑,但理解它对于正确使用继承和多态非常重要。
2025-10-10 22:22:54
436
原创 c++ 之容器与继承
输出为:2727你的输出非常清晰地展示了,同时也揭示了 std::vector。我们来逐段、逐行解析这个输出,理解每一行背后发生了什么。
2025-10-10 00:04:37
998
原创 c++ 之拷贝控制成员
你的输出完全正确且符合 C++ 的析构规则虚析构确保派生类完整析构;派生类 → 基类;后声明的先销毁;没有拷贝发生(因为用的是引用),所以没有额外对象。
2025-10-09 23:33:48
297
原创 c++ 是静态编译语言
C++ 的“可见性”由静态类型决定,“调用哪个实现”由动态类型决定(仅限虚函数)。其实这个我还是不懂,编译期是负责检查语法错误的,运行阶段可以确认调用哪个函数,什么叫可见性是有静态类型决定?你这个问题问得,而且说明你已经在思考 C++ 编译模型的底层逻辑了!👏我们来。
2025-10-08 23:00:30
431
原创 c++ 之 派生类向基类转换的可访问性
继承方式外部代码能否将D当作B使用?是否适合多态接口?public✅ 能✅ 是protected❌ 不能(除非在派生类内部)❌ 否private❌ 不能(除非在派生类内部)❌ 否🌟记住:只有public继承才表达“is-a”关系,才支持面向对象的多态设计。“派生类向基类的转换是否可访问,取决于继承的访问说明符——这是 C++ 用访问控制来保护抽象边界的重要机制。你现在不仅知道“能不能转”,更明白了“为什么这样设计”——这才是真正的 C++ 功底!💪代码模式为什么要这样设计?
2025-09-29 00:23:40
705
原创 c++ 之 基类与派生类的转换
关键点说明不拷贝对象引用只是别名,操作的是原始派生类对象保留 vptr对象内部的虚表指针仍然指向派生类的虚函数表动态分派虚函数调用通过 vptr 在运行时解析到正确版本避免切片不丢失派生类特有数据和行为语言设计C++ 用“引用/指针 + 虚函数”明确区分值语义和多态语义多态不是“基类能变成派生类”,而是“通过基类接口,操作一个完整的派生类对象”。引用(和指针)是通往这个完整对象的“桥梁”,而对象值只是它的“残影”。你现在不仅知道“怎么做”,更明白了“为什么必须这么做”——这才是真正的 C++ 多态精髓。
2025-09-27 22:45:26
932
原创 c++ 之多态虚函数表
你的疑问正确解释“基类引用为什么能指向子类?因为 C++ 允许派生类 → 基类的隐式转换(类型兼容),与虚函数无关“是因为虚函数表吗?绑定(传参)不需要 vtable;但多态调用需要 vtable“子类修改基类 vtable?❌ 子类有自己的 vtable,不修改基类的“共用一张表?❌ 每个类有自己的 vtable,子类 vtable 覆盖了重写的函数项“基类指针如何找到子类函数?通过对象内部的vptr → 指向子类 vtable → 找到子类函数地址“引用/指针能绑定子类,靠的是类型系统;
2025-09-27 22:14:21
740
原创 c++ 之动态转换 dynamic_cast
你的模糊感觉正确认知“多态靠实现”❌多态靠virtual+ 虚表实现“基类指针能自动调子类函数”⚠️仅当函数是virtual时才成立是多态的一部分”✅它是多态的补充,用于处理“无法抽象”的情况问题回答多态主要靠虚函数?✅ 是!基类指针通过虚函数表调用子类重写的方法子类特有函数需?✅ 是!因为基类接口不包含这些方法Qt 插件为何常用?因为插件提供统一基础接口 + 各自特有扩展,主程序需安全探测并使用扩展功能什么情况下需要这样做?当功能无法抽象到基类、需按需启用高级特性、或做类型特化处理时。
2025-09-27 18:02:03
1015
原创 c++ 之三/五法则
操作触发场景示例拷贝构造(Copy Constructor)创建新对象时用已有对象初始化拷贝赋值(Copy Assignment)已有对象被另一个对象赋值b = a;public:// 拷贝构造函数// ← 创建新对象// 拷贝赋值运算符// ← 给已有对象赋值深拷贝// 拷贝构造:创建新对象时深拷贝// 拷贝赋值:已有对象深拷贝if (this!// 内容拷贝因为资源管理复杂,拷贝和赋值都需要深拷贝逻辑,因此必须都自定义。问题回答“需要赋值就必然需要拷贝”?
2025-09-21 22:46:27
893
1
原创 c++ 深拷贝之 std::string 与 char*
public:// ✅ 拷贝构造:深拷贝: ps(new std::string(*hp.ps)), // 简洁、安全、高效i(hp.i){ }// ✅ 拷贝赋值if (this!i = hp.i;// ✅ 析构delete ps;
2025-09-21 00:04:58
367
原创 c++ unqiue指针
问题回答为什么unique_ptr不支持拷贝?❌ 防止多个指针管理同一对象,导致双重释放为什么release()是安全的?✅ 它转移所有权,原unique_ptr变为nullptr,防止重复释放release()会释放资源吗?❌ 不会!它只返回裸指针,你必须手动delete如何安全地“转移”所有权?✅ 使用std::move或release()(谨慎使用)noexceptnoexcept问题回答noexcept” 是什么意思?绝对不会throw异常“不会抛异常” 是程序不会崩溃吗?
2025-09-14 23:34:43
960
原创 c++ shared_ptr理解
误解正确理解“每个shared_ptr有自己的计数器”❌“计数器属于shared_ptr❌b2销毁 → 计数器消失”❌你问到了实现机制的本质。shared_ptr不是“自带计数器”,而是“加入一个共享计数系统”它说:“我不是一个人在战斗,我们是一个团队”这才是 C++ 智能指针设计的精妙之处!👏。
2025-09-13 10:39:14
449
原创 c++ 杂记
Cpp深色版本// utils.h// 声明void print(int x) { // 定义编译main.cpp时,只需要知道print存在(有声明)链接时,链接器找到print的定义✅ 成功!Cpp深色版本// utils.h// 定义在头文件中#endifCpp深色版本#include "utils.h" // 包含了完整定义print(42);// ✅ 编译器看到定义,可以实例化 print<int>
2025-09-08 22:41:46
361
原创 c++ try catch Effective C++ 条款8 别让异常出析构
【代码】c++ try catch Effective C++ 条款8 别让异常出析构。
2025-08-31 17:58:08
166
原创 C++ DDS框架学习
主题(Topic)是DDS系统的脊梁和灵魂。它是契约:定义了系统内部模块间的数据接口,是实现解耦的基石。它是地址:在全局数据空间中,它是数据的唯一寻址标识。它是策略的载体:它承载了关于数据应该如何传输的行为定义(QoS)。一个设计良好的主题系统,是一个DDS应用成功与否的首要因素。它直接决定了系统的性能、可靠性、可扩展性和可维护性。
2025-08-29 20:29:54
818
原创 Effective c++ 35条款详解
条款35给了你一个“武器库”,让你在实现多态时不再只有“虚函数”这一把锤子。方案核心思想优点缺点传统虚函数继承 + 重写简单直观紧耦合,缺乏灵活性,难以添加公共代码NVI模式基类拥有绝对控制权,便于添加公共逻辑行为仍在编译时通过继承固定函数指针Strategy模式(组合)运行时动态改变行为,解耦函数指针功能有限超级Strategy模式极致灵活,可接纳任何可调用对象语法稍复杂,可能带来运行时开销如何选择?如果你想严格控制接口的调用上下文(必须加锁、必须打日志),用NVI。如果你需要在。
2025-08-27 18:09:38
997
原创 c++ 常用接口设计
熟练掌握它们,并理解其背后的设计哲学,你的C++代码质量将迈上一个新的台阶。解决方案: 定义一个抽象接口(纯虚类),然后通过一个工厂函数(或工厂类)来返回具体实现的对象。解决方案: 使用一个不透明的指针,将类的实现细节完全隐藏在一个单独的类中,头文件中只包含接口和一个指向实现的指针。// 轻松切换类型,只需修改配置字符串。二进制兼容性: 修改 Impl 的结构不会改变 Widget 类的大小和布局,头文件不变,客户端无需重新编译。解决方案: 将资源封装在对象中,在构造函数中获取资源,在析构函数中释放资源。
2025-08-24 22:16:06
1124
原创 c++的可扩展性方法
在C++编码中,"方便扩展"通常指的是代码设计具有良好的**可维护性、可重用性和灵活性**,能够在不修改原有代码或仅少量修改的情况下,轻松添加新功能、支持新类型或适应新需求。**核心原则**:**开闭原则 (Open/Closed Principle)** —— 对扩展开放,对修改关闭。- 无需为 `int`、`double`、`std::string` 等每种类型写一个 `max` 函数。### 4. **工厂模式 (Factory Pattern) - 支持新对象创建**shape->draw();
2025-08-22 18:07:04
759
原创 qss总结
/ 假设这是你的 QGroupBox 实例。// 添加一些按钮到 QGroupBox。一、布局内部的控件统一样式设置方法。// 加载 QSS 样式表。
2025-07-30 15:57:47
166
原创 一个不起眼的问题,导致插件加载失败
之所以出现这个问题,是因为我把原项目的插件模块代码直接复制了一份,在这个基础上修改,没有注意修改这里,导致插件一直加载失败。解决过程:调试代码,定位到应该是q_plugin_metadata这里出现了问题;事故原因:一个插件模块,加载时老是提示Iid 读取失败。最终导致接口的导出出现了问题!
2025-07-22 17:39:59
281
原创 qtcreator msvc2015配置
【Qt5.9.6+MSVC2015安装配置(附带全部安装包) - CSDN App】https://blog.csdn.net/Dwj1212/article/details/124315920?
2025-07-11 11:30:46
311
空空如也
如何让自己写的代码具有可读性?
2023-08-31
如何让自己写的代码具有可读性?
2023-08-31
QMainWindow中点击按钮弹出QWidget
2022-02-23
QT fft计算问题qcustomplot画图bug
2021-11-30
继承自QPushButton的子类提示说虚函数未定义
2021-11-23
程序崩溃问题new与delete的使用
2021-11-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅