![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C/C++
文章平均质量分 80
C++的学习记录
Che3rry
这个作者很懒,什么都没留下…
展开
-
C/C++|Pimpl Idiom(Pointer to IMPLementation) 指针实现模式浅析
Pimpl Idiom(Pointer to IMPLementation),也称为 “Opaque Pointer”(不透明指针)或 “Cheshire Cat”(柴郡猫)模式或者"指针实现模式"和"实现隐藏模式"。这种模式通过将类的实现细节放在一个单独的私有结构体中,并通过指针来访问,从而在不改变类接口的情况下,允许类的实现独立于类的定义进行修改和编译。Pimpl Idiom 的核心思想是将类的实现细节放在一个私有的实现类中,并使用指向该实现类的指针在公共接口类中进行引用。这种方式可以将类的实现细节完全原创 2024-06-10 16:41:10 · 589 阅读 · 0 评论 -
C/C++|关于 namespace 在C++中的代码组织
命名空间(namespace)在C++中用于组织代码,避免命名冲突,并提供更好的代码结构和可读性。下面详细解释命名空间在C++多文件编写中的各种作用和表达。命名空间是一个声明区域,用于组织代码,防止不同部分的代码中使用相同名称的符号(如函数、类、变量等)产生冲突。在上面的示例中,MyNamespace 包含了一个变量 myVariable 和一个函数 myFunction。文件结构示例假设我们有以下文件结构:在头文件中声明命名空间和其包含的函数:math_utils.cpp在源文件中定义命名空间和其原创 2024-06-10 14:24:16 · 519 阅读 · 0 评论 -
C/C++|std::function 浅度解析
std::function 是 C++ 标准库中的一个通用多态函数包装器。它可以存储、复制和调用任意可调用目标(函数、lambda 表达式、绑定表达式或其他函数对象)。std::function 占有固定尺寸的内存,这是因为它的实现方式决定了这一点。让我们深入探讨这一点。原创 2024-06-10 09:52:58 · 1019 阅读 · 0 评论 -
C/C++|类型推导中的模式匹配
/一次调用则形如:f(expr);在编译期,编译器会通过expr推导两个型别,一个是T的型别,一个是ParamType//ParamType 是 const T&//调用语句如下:int x = 0;f(x) //以一个 int 调用 f我们可以依靠直觉就能得出正确答案:T的型别是intParamType的型别是const int&「去掉参数类型中的const和引用符号」为什么能去掉他俩呢?原创 2024-06-09 15:12:32 · 415 阅读 · 1 评论 -
C/C++|基于回调函数实现异步操作
今天我们讨论的是回调函数,我们如何通过回调函数来实现异步操作呢?我们就分别来实现一下他们吧,代码比较长,请耐心阅读。原创 2024-06-02 20:34:07 · 920 阅读 · 0 评论 -
C/C++|关于C++的异常处理机制
来自C++入门选手的理解,希望有大佬看到可以指导补充首先我们需要先讨论一下assert宏,它仅用来捕捉不应该发生的逻辑错误,而且他也不能对错误进行处理,而是直接终止程序执行。随后我们来介绍C++的异常处理机制。它允许程序中独立开发的部分能够在运行时就出现的问题进行处理。整个行文的逻辑我想先说明 try … catch…块,也就是我们如何抛出异常和捕获异常,然后我们再细致讨论这两个概念。原创 2024-06-02 15:09:17 · 1051 阅读 · 0 评论 -
C/C++|智能指针的shared_from_this和enable_shared_from_this
参考博客(或者叫摘抄的博客,本博客只做为个人学习使用):施磊老师牛逼。原创 2024-05-31 13:37:50 · 1230 阅读 · 0 评论 -
C/C++|我们为什么应该使用 `std::make_shared` 创建 `std::shared_ptr`
std::make_shared 是 C++11 引入的一个工厂函数,用于创建 std::shared_ptr。与直接使用 new 并将其传递给 std::shared_ptr 构造函数相比,std::make_shared 提供了一种更高效、更安全的方法来分配和管理动态内存。前置知识1:这一步创建了一个对象,分配了控制块的内存。控制块包含了引用计数等等信息。前置知识2:当你使用 std::make_shared 时,这两个步骤被合并为一个原子操作,。好了,从前置知识里我们应该就能大概猜到。原创 2024-05-31 12:01:30 · 995 阅读 · 0 评论 -
C/C++|回调函数的正确打开方式
/ 设置自定义回调函数// 触发事件,调用回调函数// 输出:Event triggered with code: 42return 0;原创 2024-05-31 10:40:59 · 416 阅读 · 0 评论 -
C++语法|关于C++11线程类的线程回收技术:thread线程函数传参问题、std::ref、std::future、std::promise、std::packaged_task
在C++11中,虽然库中的std::thread没有直接类似于pthread_join()的功能来获取子线程的返回数据,但可以通过几种方式实现相似的功能,主要是使用std::future和std::promise,或者std::async来从子线程获取数据。原创 2024-05-29 21:25:31 · 1285 阅读 · 0 评论 -
C/C++语法|pthread线程库的使用
所以本节完全可以不使用互斥锁。原创 2024-05-29 20:03:16 · 2784 阅读 · 0 评论 -
C++语法|thread_local详解
它指示对象拥有线程静态存储期线程存储期:对象的存储在线程开始时分配,而在线程结束时析构。每个线程拥有其自身的对象实例。thread_local 能与 static 和 extern 一同出现,以调整链接。它具有static修饰的变量一样的初始化特征和生命周期也就是说它的初始化只进行一次需要注意的是他在单独修饰类成员变量时,必须加上static。原创 2024-05-28 16:42:32 · 646 阅读 · 0 评论 -
C/C++|malloc底层原理与内存分配详解
在本节中希望读者可以一口气阅读完所有内容。这里仅为笔记记录。原创 2024-05-26 12:51:31 · 1836 阅读 · 0 评论 -
C语言|关于C语言变量的作用域、链接、存储期及相关知识(C多文件编程基础)
这些变量。原创 2024-04-26 13:10:02 · 888 阅读 · 0 评论 -
C语言学习细节|C语言面向对象编程!函数指针如何正确使用
函数指针就是一个指向函数的指针变量,与指向数据的指针不同,函数指针保存的是函数的地址,这使得程序可以动态地调用不同的函数,而无需在编译时确定具体的函数。可以在程序运行时动态得传递和调用不同的函数。原创 2024-05-15 21:47:08 · 635 阅读 · 0 评论 -
C++|动手实现strcpy、memcpy、memmove
char* dest。原创 2024-05-26 12:01:52 · 254 阅读 · 0 评论 -
C++|设计模式(〇)|设计模式的六大原则
这里文章只做简要描述,作为扫盲在软件开发过程中,遵循一定的设计原则可以帮助开发者创建更加灵活、可维护和可扩展的系统。设计模式的六大原则是面向对象设计的核心理念,本文将详细介绍这些原则,并结合实例说明它们的重要性和应用方法。原创 2024-05-25 21:03:22 · 486 阅读 · 0 评论 -
C++|设计模式(六)|⭐️适配器模式
适配器模式是一种结构型设计模式,。适配器这一角色,通过将一个类的接口转换成客户期望的另一个接口,使原本借口不兼容的类可以协同工作。原创 2024-05-23 10:00:51 · 198 阅读 · 0 评论 -
C++|设计模式(四)|代理模式
首先我们需要有公共的抽象类;public://免费电影//vip电影//用券观看委托类。它需要从公共的抽象类继承而来。public:void freeMovie() override { //免费电影cout << "观看免费电影" << endl;void vipMovie() override { //vip电影cout << "观看vip电影" << endl;void tickMovie() override {//用券观看。原创 2024-05-22 14:59:46 · 347 阅读 · 0 评论 -
C++|设计模式(三)|抽象工厂模式
抽象工厂模式仍然属于创建型模式,我们在这篇文章中,描述了简单工厂和工厂方法模式,并在文末,简单介绍了工厂方法模式的局限性。本文将通过汽车工厂的例子继续来阐述使用抽象工厂模式相比较于工厂方法模式的优势。原创 2024-05-21 11:52:46 · 1080 阅读 · 0 评论 -
C++|设计模式(二)|简单工厂和工厂方法模式
本文探讨两种广泛使用的创建型模式——简单工厂模式和工厂方法模式,解释他们的实现细节、优势以及应用场景。在下一篇文章中,我会补充抽象工厂模式,其实工厂模式主要就是为了封装对象的创建过程,如果我们不进行封装,如果对象较多,创建过程就需要我们自己new来new去,并且还要记住具体类的初始化方法,还是太麻烦了。也就是说如果我们需要什么样的对象,就直接去找工厂申请,让它来代工,工厂提供了一个统一的接口。工厂模式使用的前提,一般就是我们要创建的类比较多的时候来使用,可以大大简化程序猿的工作量。原创 2024-05-21 11:15:20 · 828 阅读 · 0 评论 -
C++语法|对象的浅拷贝和深拷贝
/以下就是默认的浅拷贝操作++i) {在这里我们就对指针类型做了一个深拷贝。原创 2024-05-15 19:19:56 · 536 阅读 · 0 评论 -
C++后端领域聚焦——存储系统和分布式系统
分布式系统概念:理解分布式系统的基本概念和挑战,如一致性、可用性、分区容忍性(CAP 定理)。网络编程:掌握网络通信的基本原理和技术,如 RPC、gRPC、HTTP/2。原创 2024-05-15 12:16:57 · 927 阅读 · 0 评论 -
C++语法|虚函数与多态详细讲解系列(包含多重继承内容)
看了(一)~(三)的讲解,该部分如果作为面试题存在,也并不需要死记硬背了,但是虚析构函数的使用时机还是非常重要的。虚继承是为解决多重继承问题专门设计的语法规则吗?我也不知道,但是虚继承确实是解决菱形问题最直接的方法!本文从汇编的角度带你理解虚函数,在CPU级的理解下,静态绑定和动态绑定也不过是很简单的内容。该文章基本解决了虚函数表和虚函数指针的构造时机,是理解虚函数和多态的前置内容。你真的理解类对象的内存结构吗?抽象类是一种很常见的设计理念,简单但是重要!本文从类的内存结构带你真正理解多态。原创 2024-05-20 21:36:43 · 408 阅读 · 0 评论 -
C++语法|虚函数与多态详细讲解(三)|深入理解多态
本文主要内容来自首先我们需要明确一点,很多语言都支持多态,与其说多态是语法规则,不如说是一种设计技巧,多态不仅有代码复用的特性,它的精髓就在于虚函数的存在,使得我们能够完成函数的“覆盖”或者说“重写”。我们首先要明确多态的基本规则:多态,常会用基类指针指向派生类对象多态,会利用派生类的结构特点复用基类的属性(变量/函数)多态,会利用虚函数来扩展派生类的特性。原创 2024-05-20 21:24:46 · 626 阅读 · 0 评论 -
C++语法|虚函数与多态详细讲解(二)|深入理解虚函数
本文主要内容来自。原创 2024-05-20 20:41:16 · 458 阅读 · 0 评论 -
C++语法|虚函数与多态详细讲解(一)|再谈构造函数(构造函数与虚函数表)
本文主要内容来自。原创 2024-05-20 20:06:58 · 428 阅读 · 0 评论 -
C++语法|C++11标准实现生产者消费者模型
在多线程编程中,生产者-消费者问题是一个经典的同步问题,它涉及到两种类型的线程:生产者和消费者。生产者负责生成数据放入缓冲区,而消费者则从缓冲区中取出数据。本文将详细介绍如何使用 C++11 的新特性来实现这一模型。首先,定义了一个名为Queue的类,它是生产者和消费者共享的队列。该队列内部使用std::queue来存储数据,并配有std::mutex和std::condition_variable来实现线程同步。put方法:当生产者生成一个新的物品时,首先会获取互斥锁。原创 2024-05-20 16:22:53 · 506 阅读 · 0 评论 -
C++语法|虚函数与多态详细讲解(五)|虚函数的调用一定是动态绑定吗?
在类的构造函数中,调用虚函数,也是静态绑定(构造函数中调用其他函数(虚),不会发生动态绑定)原创 2024-05-20 16:02:14 · 303 阅读 · 0 评论 -
C++语法|虚函数与多态详细讲解(四)|哪些函数不能实现成虚函数和虚析构函数的理解
我们简单分析一下就知道,由于我们的指针是Base*类型,所以它的析构函数属于静态绑定,绑定的是Base的析构函数,所以我们在释放内存时,只调用了Base的析构函数。基类的指针(引用)指向堆上new出来的派生类对象的时候,delete pb(基类的指针),他调用析构函数的时候,必须发生动态绑定,不然会导致派生类的析构函数无法被调用。随后我们调用pd指向的show(),调用的是Derive::show(),这是由于该函数是动态绑定的。最后我们释放pb的内存,竟然只析构了Base(),不析构Derive()!原创 2024-05-20 16:02:05 · 940 阅读 · 0 评论 -
C++|四种方法解决三线程按顺序轮流打印ABC的问题:互斥锁和条件变量、原子操作、信号量
无锁实现控制打印顺序,但会占用更多的CPU资源,因为线程在等待时处于忙等(busy-waiting)状态。C++20之后引入的库,才使得C++语言级别的信号量实现,编译的时候记得加一个。原创 2024-05-20 16:01:10 · 347 阅读 · 0 评论 -
C++|设计模式(一)|单例模式与多线程
本文讲解重点在线程安全的懒汉式单例模式。原创 2024-05-20 11:54:40 · 1091 阅读 · 0 评论 -
C++语法|C++的类型转换:const_cast、static_cast、reinterpret_cast、dynamic_cast
由于我们的derive02func()是新写的函数,基类中也不存在该虚函数,所以只能是静态绑定,我们也只能通过Derive2类型的指针来进行访问。dynamic_cast往往用在继承结构中,特别是存在虚函数表的情况下,该方法对于统一接口的改进,使得多态能够变得更加灵活。我们可以使用C风格的方式进行类型转换,我们也可以用C++风格的类型转换,想把它转成什么类型,尖括号<>就写什么类型。此时我们需要关注 *p的类型,当它是Derive2类型的,我们就需要去调用。原创 2024-05-19 21:52:38 · 788 阅读 · 0 评论 -
C++语法|多重继承详解(二)|菱形继承的问题及解决方法
多重继承很容易导致菱形继承的问题:这里有一个很明显的问题,我们的D不仅从基类B中继承到了ma,还从基C中也继承到了ma。这在软件设计过程中肯定是有问题的。这就是所谓的菱形继承问题。这种设计模式也有很明显的问题。原创 2024-05-19 20:25:09 · 810 阅读 · 0 评论 -
C++语法|多重继承详解(一)|理解虚基类和虚继承
我们可以看出,其中实例化A的对象a占4个字节;实例化B的对象b占8个字节。在这里,我们的类A被virtual修饰,所以A被称为虚基类。A 和 B 的继承关系就是虚继承此时我们的 A 还是占 4个字节;但是 B 却占了12个字节??原创 2024-05-19 20:24:59 · 995 阅读 · 0 评论 -
C++语法|虚函数与多态详细讲解(七)|理解抽象类?(面试向)
在这里,我们的动物是一个基类。我们需要明确,定义Animal的初衷,并不是让Animal抽象某个实体的类型。定义某一个基类,并不是让该类抽象某个实体的类型。总结1:抽象类和普通类有什么区别?总结2:一般把什么类作为抽象类?原创 2024-05-19 17:30:11 · 202 阅读 · 0 评论 -
C++语法|虚函数与多态详细讲解(六)|如何解释多态?(面试向)
多态分为了两种,一种是静态的多态,一种是动态的多态。原创 2024-05-19 17:17:57 · 290 阅读 · 0 评论 -
C++语法|继承与多态|成员的重载、隐藏和覆盖
如果发生了基类与派生类中有成员名字相同时,那么他们之间肯定是要产生关系的,所以这就涉及到了成员的重载、隐藏和覆盖。原创 2024-05-19 15:00:34 · 345 阅读 · 0 评论 -
C++语法|多态基础|派生类与基类对象的相互转换
从基类对象到派生类对象的转换在 C++ 中不是隐式允许的,因为这种转换通常是不安全的。如果必须进行此类转换,需要使用 static_cast,但这种做法通常不推荐,因为它违背了面向对象的多态原则,并且可能导致运行时错误。当派生类对象赋值给基类对象时,只有派生类对象中的基类部分会被复制到基类对象中,这个过程通常称为“对象切割”(Object Slicing),其中派生类独有的任何属性或方法都不会被复制。我们将派生类赋给了基类,这是被允许的!红色部分是派生类特有的成员,蓝色部分是派生类从基类继承的成员。原创 2024-05-19 13:15:02 · 277 阅读 · 0 评论 -
C++代码|继承的本质(一)|代码的复用|不同继承方式对基类和派生类访问限定的影响
外部只能访问对象public的成员,protected和private的成员无法直接访问。在继承结构中派生类从基类可以继承过来private的成员,但是派生类却无法直接访问。protected和private的区别?在基类中定义的成员,想被派生类访问,但是不想被外部访问,那么在基类中,把相关成员定义成pretected保护的;如果派生类和外部都不打算访问,那么在基类中,就把相关成员定义成private私有的。原创 2024-05-19 10:54:56 · 435 阅读 · 0 评论