c++
文章平均质量分 69
分类总结一些c++ 常见的问题
不是杠杠
严于律己,宽以待人。
学无止境
展开
-
strlen和sizeof
strlen 和 sizeof 是 C 语言中两个用于确定字符串或数据类型大小的常用操作符,但它们的工作方式和目的有所不同。下面是对这两个操作符的详细解释:原创 2024-03-26 09:04:36 · 1016 阅读 · 0 评论 -
线程(thread)
线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix/Linux系统中,使用POSIX线程库(也称为pthread库)来支持多线程编程。原创 2024-03-13 15:04:06 · 576 阅读 · 0 评论 -
类的关系 继承(Inheritance)、聚合(Aggregation)和关联(Association)
在面向对象编程中,类之间的关系主要有以下几种:继承(Inheritance)、聚合(Aggregation)和关联(Association)。每种关系在对象的创建和销毁时,构造函数和析构函数的调用顺序都会有所不同。下面我将分别解释这些关系,并举例说明构造函数和析构函数的调用顺序原创 2024-03-07 18:11:47 · 967 阅读 · 0 评论 -
浅拷贝 深拷贝
在C++中,浅拷贝和深拷贝是对象复制时非常重要的概念,尤其在处理动态分配的内存和复杂数据结构(如指针、数组和自定义对象)时。下面详细解释这两种拷贝方式,并提供相应的示例。原创 2024-03-07 17:52:53 · 208 阅读 · 0 评论 -
临时对象
临时对象是在程序中隐式创建并用于保存某种状态的对象,它在创建后立即被使用,并在使用完毕后立即被析构。这种对象通常没有显式的名字,是为了简化代码编写和提高效率而由系统自动创建的。原创 2024-03-07 17:45:00 · 406 阅读 · 0 评论 -
运算符重载(Operator Overloading)
在C++中,运算符重载(Operator Overloading)是一种允许程序员为自定义数据类型重新定义或重载已有的运算符的功能。通过运算符重载,我们可以使得自定义类型的对象能够像内置类型(如int、float等)一样使用运算符原创 2024-03-07 17:31:30 · 861 阅读 · 0 评论 -
friend(c++ 关键字)
C++中,friend关键字用于声明友元函数或友元类,它们可以访问类的私有(private)和保护(protected)成员,即使它们不是类的成员。这提供了一种突破数据封装和隐藏的方式,使得某些函数或类能够访问另一个类的内部状态。原创 2024-03-07 17:11:39 · 486 阅读 · 0 评论 -
typename
typename是 C++ 模板编程中的一个关键字,它用于解决模板编译时的依赖名称问题。在模板编程中,有时编译器无法确定一个名称是否代表一个类型还是一个值,这时候就需要使用typename来明确告诉编译器这个名称是一个类型。原创 2024-02-29 13:46:55 · 240 阅读 · 0 评论 -
解析器模式(Parser Pattern)
解析器模式(Parser Pattern)是一种行为设计模式,用于将输入的数据解析成特定的结构或对象。它通常涉及到一个或多个解析器类,这些类负责处理输入并构建所需的输出结构。解析器模式特别适用于复杂的语法或格式要求,比如编程语言、配置文件或数据协议。原创 2024-02-28 16:54:42 · 312 阅读 · 0 评论 -
访问器模式(Visitor Pattern)
义访问器模式(Visitor Pattern)是一种将数据结构与数据操作分离的设计模式,它可以将对数据的操作添加到数据结构中,而不必修改已有的数据结构。这允许我们定义新的操作,而不需要修改已有的类结构。原创 2024-02-28 10:46:17 · 576 阅读 · 0 评论 -
命令模式(Command Pattern)
命令模式(Command Pattern)是一种行为设计模式,它允许将请求封装成一个对象,从而让你使用不同的请求把客户端与接收者解耦。命令模式的主要目标是实现请求的发送者和接收者之间的解耦,使得发送者不需要知道接收者的具体实现,而接收者也不需要知道请求的具体来源。原创 2024-02-28 08:49:06 · 1255 阅读 · 0 评论 -
职责链模式(Chain of Responsibility Pattern)
职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许对象接收请求并将其沿着处理者链传递,直到有一个处理者处理它为止。职责链模式通过将请求的处理逻辑分布原创 2024-02-27 14:52:57 · 384 阅读 · 0 评论 -
迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问聚合对象中的各个元素,而不需要暴露该对象的内部表示。迭代器模式使得客户端代码能够独立于聚合对象的具体实现进行遍历操作。原创 2024-02-27 14:43:01 · 488 阅读 · 0 评论 -
组合模式(Composite Pattern)
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构,并且能像使用单独对象一样使用组合对象。组合模式让客户端代码对单个对象和复合对象的使用具有一致性。原创 2024-02-27 14:28:51 · 692 阅读 · 0 评论 -
备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在以后将对象恢复到该状态。备忘录模式通常用于实现撤销操作(Undo)或历史记录(History)等功能。原创 2024-02-27 14:16:26 · 581 阅读 · 0 评论 -
状态模式(State Pattern)
状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。这意味着,当对象的状态发生变化时,它的行为也会发生变化。状态模式特别适用于行为依赖于其状态的对象,而且当这些状态可以独立于对象的其他部分进行变化时。原创 2024-02-27 14:05:27 · 615 阅读 · 0 评论 -
中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern)是一种行为设计模式,它用于将一组对象的交互行为封装在一个中介者对象中,从而减少对象之间的直接耦合。这种模式提供了一种集中式的控制方式,通过中介者对象来协调不同对象之间的交互。原创 2024-02-27 13:39:25 · 383 阅读 · 0 评论 -
适配器模式(Adapter Pattern)
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另一个接口。这种模式通常用于解决接口不兼容的问题。适配器模式包括三个角色:目标接口(Target)、适配器(Adapter)和被适配者(Adaptee)原创 2024-02-26 23:29:21 · 746 阅读 · 0 评论 -
代理模式(Proxy Pattern)
代理模式(Proxy Pattern)是一种结构型设计模式,其目的是为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理类通常在客户端和目标对象之间起到中介的作用,用于控制对目标对象的访问,并在必要时添加额外的功能。原创 2024-02-26 23:20:21 · 849 阅读 · 0 评论 -
门面模式(Facade Pattern)
门面模式(Facade Pattern)是一种结构型设计模式,旨在为一个复杂子系统提供一个简单的接口。它提供了一个高层接口,使得客户端可以更容易地使用这个子系统,而不需要了解其内部的复杂性。原创 2024-02-26 23:09:28 · 385 阅读 · 0 评论 -
享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)是一种结构型设计模式,其主要目的是通过共享尽可能多的数据来减少内存使用和提高性能。它通常在需要创建大量相似对象的情况下使用,以减少对象的数量和内存消耗。原创 2024-02-26 22:42:40 · 475 阅读 · 0 评论 -
单例模式(singleton)
单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。这样可以确保在整个应用程序中只存在一个实例,避免了多次实例化造成的资源浪费,并且提供了一个统一的访问点以便于对该实例的管理。原创 2024-02-26 18:00:54 · 2146 阅读 · 0 评论 -
构建模式(Build Pattern)
"构建模式"(Build Pattern)通常指的是一种设计模式,它用于处理对象的构建过程,将构建过程与其表示过程分离,使得同样的构建过程可以创建不同的表示。在构建模式中,通常有一个“导演”(Director)对象负责控制构建过程,而具体的构建步骤则由一组“构建器”(Builder)对象来完成。构建模式可以是原型模式(Prototype Pattern)的一个变体,尤其是在处理构建复杂对象时,这些对象可能包含许多属性,并且构建过程可能涉及多个步骤。原创 2024-02-23 15:09:29 · 665 阅读 · 0 评论 -
原型模式(Prototype Pattern)
原型模式是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。这种方式可以在不知道具体对象类型的情况下创建新的实例,同时还能够避免耦合性,使得系统更灵活。原创 2024-02-23 13:40:24 · 527 阅读 · 0 评论 -
工厂方法(Factory Methods),抽象工厂(Abstract Factory )
工厂方法(Factory Methods),抽象工厂(Abstract Factory )原创 2024-02-23 11:18:34 · 1176 阅读 · 0 评论 -
桥模式(Bridge Pattern)
桥模式是一种结构型设计模式,其主要目的是将抽象部分与实现部分分离,使它们可以独立变化。这样可以更灵活地组合不同的抽象部分和实现部分,而不需要修改已有的代码。原创 2024-02-22 18:04:54 · 503 阅读 · 0 评论 -
big three(c++)
"Big Three"是指在C++类中需要手动实现的三个特殊成员函数,分别是拷贝构造函数(Copy Constructor)、拷贝赋值运算符(Copy Assignment Operator)和析构函数(Destructor)。这三个函数通常需要在类的实现中进行显式定义,因为它们涉及到资源的管理和对象的复制行为。通常情况下,拷贝构造函数的参数是同类型的另一个对象的引用,并在其中将其成员变量复制到当前对象中。拷贝赋值运算符用于将一个已经存在的对象的值赋给另一个已经存在的对象。原创 2024-02-19 14:07:49 · 390 阅读 · 0 评论 -
uniform initialization(一致化初始化)
uniform initialization(一致化初始化)原创 2024-02-01 21:08:52 · 276 阅读 · 0 评论 -
noexcept 关键字
noexcept是 C++ 中的一个关键字,用于指示一个函数是否可能抛出异常。在函数声明或定义时使用noexcept关键字,可以告诉编译器该函数不会抛出异常,或者该函数可能会抛出异常。原创 2024-01-31 14:26:56 · 1143 阅读 · 0 评论 -
虚函数,虚指针,虚表,虚析构函数和多态
而且,只要它是最后的构造函数调用,那么在这个对象的生命期内,VPTR将保持被初始化为指向这个VTABLE, 但如果接着还有一个更晚派生的构造函数被调用,这个构造函数又将设置VPTR指向它的 VTABLE,等.直到最后的构造函数结束。多态,就是存在虚函数的基类和存在一个或者多个基于该基类(并且实现了该基类的虚函数)的派生类,当一个基类指针指向不同的派生类时,通过基类指针调用虚函数,会有不同的实现,从而实现虚函数的多态性质。当使用基类指针或引用调用虚函数时,实际调用的是指向派生类的虚函数表的相应虚函数。原创 2024-01-31 10:05:25 · 1299 阅读 · 1 评论 -
decltype 关键字
decltype 关键字在 lambda 表达式中通常用于指定 lambda 函数的返回类型或者获取 lambda 表达式中某个表达式的类型。在这个例子中,decltype(t * u) 用于确定 lambda 函数的返回类型,它将是 t 和 u 相乘的类型。在这个例子中,decltype(x + y) 用于指定 lambda 函数的返回类型,它将是 x 和 y 相加的类型。提供了一种灵活的方式来处理表达式的类型,特别是在模板和泛型编程中,可以用于自动地推导表达式的类型而不依赖于硬编码。原创 2024-01-31 09:22:20 · 376 阅读 · 0 评论 -
指针变量、表示资源描述符的变量、BOOL变量声明必须赋予初值
通过gdb查看崩溃的core文件,原因:因为传入的参数是fCondition,pMsg没有初始化没有指定为nullptr,在12行释放了无效指针。对全局变量,静态变量,在编译阶段自动初始化为0或者等于NULL,不用在定义时强制初始化。因为系统会自动初始化为0或者NULL;变量声明赋予初值,可以避免由于编程人员的疏忽导致的变量未初始化引用。如上图2程序报无效指针,直接崩了。原创 2023-07-04 15:39:00 · 152 阅读 · 0 评论 -
core文件调试(gdb)
运行linux时,我们可以设定程序在崩溃的时候生成code文件。原创 2023-07-04 14:16:54 · 7483 阅读 · 0 评论 -
不可重入函数和可重入函数
在编程中,函数可以分为两种类型:可重入函数(reentrant function)和不可重入函数(non-reentrant function)。在并发编程中,通常建议使用可重入函数或线程安全函数,以确保程序在并行执行时的正确性和可预测性。如果需要使用不可重入函数,必须采取适当的同步机制来保护共享资源,以避免竞态条件和数据损坏。,它不是线程安全的,并且在多线程环境中可能导致竞态条件(race condition)。由于函数的执行不依赖于共享状态,它可以在多线程环境中安全地调用。原创 2023-06-27 11:51:14 · 173 阅读 · 0 评论 -
带有string的结构体赋值和清零
它会将字符串内部的字符数组长度设置为 0,从而实现清零的效果。对象的内部状态,直接操纵内存,可能会导致内存泄漏、字符串截断、指针错误等问题。成员变量调用相应的清零操作,你可以实现对结构体中不同类型成员变量的清零操作。类型是一个动态分配的字符串对象,具有自己的内存管理和维护。类提供的方法来进行操作,以确保正确处理字符串的内部状态和内存管理。类型的成员变量,想要清零(即将其内容置为空字符串),可以使用。最后,我们打印出清零后的字符串,可以看到它被成功清空了。对象的内部状态,确保字符串的正确处理和内存管理。原创 2023-06-25 17:23:21 · 1700 阅读 · 0 评论 -
泛型编程(函数模板,类模板,成员函数模板,模板偏特化,模板模板)
类的模板模板(Template Template for Classes)是C++中一种高级的模板技术,它扩展了模板模板的概念,使得我们可以定义接受模板类作为参数的类模板。通过使用类的模板模板,我们能够编写更加灵活和通用的类模板,使其能够处理不同类型的模板类作为参数。总之,模板模板是C++中一种强大的模板技术,允许我们定义接受模板作为参数的模板。成员模板函数是类模板中的成员函数,其模板参数独立于类模板的模板参数。类模板是一种通用的类定义,类的成员变量和成员函数的类型可以在类定义时使用模板参数。原创 2023-06-25 14:26:34 · 230 阅读 · 0 评论 -
断言(ASSERT)
断言(Assertion)是一种在程序中插入的检查机制,用于验证某个条件是否为真。它通常用于调试阶段,帮助开发人员在程序中的关键位置或者假设语句中验证预期的条件是否满足。如果断言的条件为假,那么程序会终止并生成相应的错误消息。断言是一种强大的调试工具,它可以帮助开发人员在程序中进行条件验证和错误检测。正确使用断言可以提高代码的可靠性和调试效率。在许多编程语言中,包括C、C++、Java和Python等,都提供了断言的机制。其中最常用的形式是通过。为假,程序将终止并生成一个错误消息,指示出现了一个断言错误。原创 2023-06-25 13:31:39 · 333 阅读 · 0 评论 -
stackoverflow异常
Stack Overflow 异常是指当程序的递归或函数调用层级过深时,栈空间不足以容纳函数调用所需的数据而导致的异常。如果递归或函数调用的层级过深,栈空间可能会耗尽,导致栈溢出并触发 Stack Overflow 异常。大规模的局部变量:如果函数中声明了大型的局部变量数组或者分配了大块的局部变量存储空间,并且函数的递归或调用层级很深,栈空间可能会超出限制而触发异常。减少局部变量的使用或调整变量的大小:如果函数声明了大量或大型的局部变量,尝试减少变量的使用或将它们移动到堆上进行动态内存分配。原创 2023-06-25 11:36:47 · 976 阅读 · 0 评论 -
c++ 打印封装 每次打印前面加上时间戳
c++ 打印封装 每次打印前面加上时间戳原创 2022-08-22 21:12:17 · 667 阅读 · 0 评论 -
c++ 基础三
不能重载的运算符 * sizeof运算符 * :: 作用域解析运算符 * ?: 条件运算符 * . 直接成员运算符 * .* 成员指针运算符 * tpeid * const_cast * dynamstic_cast * reinterpret_cast * static_cast只能通过成员函数进行重载 * = 赋值运算符 * () 函数调用运算符 * [] 下标 * -> 间接成员运算符大部分...原创 2022-01-04 19:25:29 · 840 阅读 · 1 评论