随笔分类 -  C++

摘要:我们无法直接模拟std::weak_ptr,因为它的功能依赖于std::shared_ptr的控制块。但是,我们可以通过扩展之前实现的MySharedPtr来模拟weak_ptr的基本行为。 思路: 在MySharedPtr的控制块中增加一个弱引用计数。 MyWeakPtr将包含与控制块相同的指针, 阅读全文
posted @ 2025-11-25 15:53 [BORUTO] 阅读(13) 评论(0) 推荐(0)
摘要:我们手动实现一个简化版的unique_ptr,它将拥有独占所有权,并且支持移动语义,但不支持拷贝语义。我们将实现以下功能: 构造函数:从原始指针构造 析构函数:释放资源 移动构造函数:转移所有权 移动赋值运算符:转移所有权 禁止拷贝构造和拷贝赋值 重载 operator* 和 operator-> 阅读全文
posted @ 2025-11-25 15:34 [BORUTO] 阅读(13) 评论(0) 推荐(0)
摘要:我们手动实现一个简化版的shared_ptr,主要实现引用计数功能。注意,这只是一个教学示例,实际标准库的实现要复杂得多,考虑了线程安全、自定义删除器、类型转换等很多特性。 我们要实现的核心功能: 构造函数:从原始指针构造 拷贝构造函数:增加引用计数 赋值操作符:减少左值的引用计数,并增加右值的引用 阅读全文
posted @ 2025-11-25 14:16 [BORUTO] 阅读(17) 评论(0) 推荐(0)
摘要:一、C++11为什么要引入std::function? 在 C++03 的时代,是使用函数指针来把一个函数作为参数传递,这样我们就可以实现回调函数的机制。程序设计,特别是程序库设计时,经常需要涉及到回调,如果针对每种不同的可调用对象单独进行声明类型,代码将会非常散乱,也不灵活。 所以 C++11 就 阅读全文
posted @ 2025-05-29 14:28 [BORUTO] 阅读(65) 评论(0) 推荐(0)
摘要:在 C++ 中,虚基类(Virtual Base Class) 是解决多重继承中菱形继承(菱形问题/Diamond Problem)的核心机制。当多个派生类继承自同一个基类,而最终又有一个类同时继承这些派生类时,可能会引发数据冗余和二义性问题。虚基类通过共享基类实例来解决这个问题。 菱形继承问题示例 阅读全文
posted @ 2025-03-07 12:24 [BORUTO] 阅读(203) 评论(0) 推荐(0)
摘要:在C++中,虚析构函数和纯虚析构函数的作用与多态性和资源管理密切相关。以下是它们的详细说明: 一、虚析构函数的作用 1. 核心问题 当通过基类指针删除一个派生类对象时,如果基类的析构函数不是虚函数,则只会调用基类的析构函数,而不会调用派生类的析构函数。这会导致派生类中分配的资源(如内存、句柄等)未被 阅读全文
posted @ 2025-03-07 12:09 [BORUTO] 阅读(305) 评论(0) 推荐(0)
摘要:C语言描述: #include "stdio.h" #include "stdlib.h" #include "assert.h" //二维数组内存申请 int** createArray2D(int row, int clos) { int** pArray = (int**)malloc(siz 阅读全文
posted @ 2024-08-08 15:14 [BORUTO] 阅读(296) 评论(0) 推荐(0)
摘要:示例: 来看一行简单的代码 1 int a = 10; 这行代码,"=" 左边就是左值,"="右边的则为右值,那他们到底有什么不同呢? 如果是Java、PHP等后端同学,会称以左边的"a"为变量,右边的"10"为字面量,而到了C++这里,我们就需要对他理解更多一点。 这行代码运行起来,是在系统内存中 阅读全文
posted @ 2024-08-01 16:55 [BORUTO] 阅读(57) 评论(0) 推荐(0)
摘要:1. 说明 在VS里用MS编译器不能直接调用pthread库,需要先自行下载 下载链接1:http://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip 下载链接2:https://sourceware.org/pub/ 阅读全文
posted @ 2024-07-30 15:19 [BORUTO] 阅读(988) 评论(0) 推荐(0)
摘要:概述 为什么要学习解析Json文件? 工作需要呗! 最近在工作项目中,有需求是需要进行解析Json字符串的,但是我只会使用QT去解析Json,且主管规定要使用C/C++语言去解析,说是为了方便移植到其他项目中进行使用… 没办法,只能硬着头皮,在网上找找有没有什么解析Json的开源库是C/C++可以使 阅读全文
posted @ 2024-07-29 16:44 [BORUTO] 阅读(76) 评论(0) 推荐(0)
摘要:1. CMake概述 CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 make 阅读全文
posted @ 2024-07-18 12:02 [BORUTO] 阅读(968) 评论(0) 推荐(0)
摘要:一、隐式类型转换和显示类型转换 当等号两边的类型不同的时候、形参与实参类型不匹配的时候、返回值类型与接收返回值类型不一致时,就需要发生类型转化。而类型转换又分为隐式类型转换和显示类型转换。 #include <stdio.h> #include <stdlib.h> int main() { // 阅读全文
posted @ 2024-05-08 14:45 [BORUTO] 阅读(2368) 评论(0) 推荐(0)
摘要:1. 初始化一个引用成员 class CBase { public: CBase(int a) : m_a(a) //正确,m_a是一个变量的引用,必须通过初始化列表初始化 { // m_a = a; //错误 cout << "m_a:" << m_a << endl; } public: int 阅读全文
posted @ 2024-04-18 11:15 [BORUTO] 阅读(324) 评论(0) 推荐(0)
摘要:C++ 异常处理 异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。 异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。 throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键 阅读全文
posted @ 2023-10-13 10:42 [BORUTO] 阅读(45) 评论(0) 推荐(0)
摘要:1. 智能指针基本概念 1.1 RAll RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。 在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效, 阅读全文
posted @ 2023-10-13 10:07 [BORUTO] 阅读(162) 评论(0) 推荐(0)
摘要:C++ 命名空间 假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。 同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一 阅读全文
posted @ 2023-10-11 17:39 [BORUTO] 阅读(36) 评论(0) 推荐(0)
摘要:大家都知道,在 C++ 中可以通过 typedef 重定义一个类型: typedef unsigned int uint_t; 被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。因此,下面这样将不是合法的函数重载: void func(unsigned int); void fu 阅读全文
posted @ 2023-10-11 17:20 [BORUTO] 阅读(181) 评论(0) 推荐(0)
摘要:《C++11是什么》一节中提到,在 C++98/03 标准的基础上,C++11 标准对 C++ 语言增添了约 140 个新特性。本节要讲的右值引用就是众多新特性中的一个,同时也是最重要的特性之一。很多初学者都感觉右值引用晦涩难懂,其实不然。右值引用只不过是一种新的 C++ 语法,真正理解起来有难度的 阅读全文
posted @ 2023-10-11 17:20 [BORUTO] 阅读(87) 评论(0) 推荐(1)
摘要:1. 基本用法 lambda 表达式是 C++11 最重要也是最常用的特性之一,这是现代编程语言的一个特点,lambda 表达式有如下的一些优点: 声明式的编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或函数对象。 简洁:避免了代码膨胀和功能分散,让开发更加高效。 在需要的时间和 阅读全文
posted @ 2023-10-11 17:18 [BORUTO] 阅读(126) 评论(0) 推荐(0)
摘要:1. 委托构造函数 委托构造函数允许使用同一个类中的一个构造函数调用其它的构造函数,从而简化相关变量的初始化。下面举例说明: #include <iostream> using namespace std; class Test { public: Test() {}; Test(int max) 阅读全文
posted @ 2023-10-11 17:17 [BORUTO] 阅读(208) 评论(0) 推荐(0)