![](https://img-blog.csdnimg.cn/3a8f5ba4ddcf4e1487880bffc55ebdbd.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C过度到C++
文章平均质量分 54
基本:C语言基本常见使用
过度:从C过度到C++
进阶:基本入门C++的使用
起风就扬帆
自动驾驶芯片从业者
展开
-
C++[第五十章]--工厂模式(factory)
工厂模式是用工厂方法代替new操作的一种模式。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量(降低耦合)。原创 2023-07-31 09:14:22 · 67 阅读 · 0 评论 -
C++[第五十二章]--适配器模式(AdapterPattern)
适配器(Adapter):将不兼容的接口转换成兼容的接口,实现了目标接口,并持有需要适配的对象的引用或指针。目标接口(Target):客户端期望的接口,该接口与现有的类库或第三方库的接口不兼容。需要适配的类(Adaptee):需要被适配的现有类,其接口与目标接口不兼容。客户端(Client):调用目标接口来实现其业务逻辑的应用程序。原创 2023-07-31 09:14:14 · 37 阅读 · 0 评论 -
C++[第五十一章]--装饰器模式(DecoratorPattern)
装饰器模式是一种结构型设计模式,它允许在运行时动态地添加行为或功能到一个对象上,而无需修改该对象的实现。在C++中,可以使用继承来实现装饰器模式。原创 2023-07-31 09:14:04 · 93 阅读 · 0 评论 -
C++[第四十九章]--观察者模式(Observer Pattern)
观察者模式(Observer Pattern)是一种行为型设计模式,用于对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖它的对象都会收到通知并自动更新。原创 2023-07-31 09:13:57 · 36 阅读 · 0 评论 -
C++[第四十八章]--策略模式(Strategy Pattern)
上下文(Context):持有一个策略对象,并在需要时调用策略对象的方法。策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们之间可以相互替换,以使得算法的变化独立于使用算法的客户端。策略模式让算法独立于使用它的客户端,具体策略实现类(Concrete Strategy):实现了策略接口,封装了不同的算法实现。策略接口(Strategy):定义了所有具体策略实现类的公共接口。可以在不修改客户端代码的情况下,更换算法或者增加新的算法。原创 2023-07-31 09:13:09 · 35 阅读 · 0 评论 -
C++[第四十七章]--单例模式
由于Singleton模式的目的是保证一个类只有一个实例,因此该类的构造函数必须是私有的,不能直接被其他代码所调用。因此,Singleton模式的实现方式通常是将类的构造函数设为私有的,并提供一个公有的静态方法来返回类的唯一实例。其他代码只能通过该静态方法来获取该类的实例,而不能直接调用类的构造函数。原创 2023-07-31 09:13:01 · 27 阅读 · 0 评论 -
C++[第四十六章]--程序设计原则
这样可以使代码更加灵活和可扩展,因为当需要添加新功能时,我们可以通过添加新的子类来扩展程序的行为,而不需要修改现有代码。这个原则指出,一个类应该对扩展开放,对修改封闭。这样可以使代码更加健壮和可维护,因为当需要添加新功能时,我们不需要修改现有代码,只需要添加新的代码即可。这样可以使代码更加可维护和可扩展,因为如果一个类负责的职责过多,当需要修改其中一个职责时,就可能影响到其它职责的代码,导致代码变得复杂难以维护。这样可以使代码更加可扩展和灵活,因为当我们需要添加新的功能时,我们只需要实现需要的接口即可。原创 2023-07-31 09:12:53 · 52 阅读 · 0 评论 -
C++[第四十五章]--常见算法函数
find_if_not() 函数和 find_if() 函数的功能恰好相反,通过上面的学习我们知道,find_if() 函数用于查找符合谓词函数规则的第一个元素,而 find_if_not() 函数则用于查找第一个不符合谓词函数规则的元素。可以将前两个正向迭代器参数指定的序列中的元素复制到第三个参数指定的目的序列中,并忽略和第 4 个参数相等的元素。transform() 可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。原创 2023-07-30 18:29:19 · 35 阅读 · 0 评论 -
C++[第四十四章]--哈希容器(无序关联形容器)
不再以键值对的形式存储数据,而是直接存储数据元素本身(当然也可以理解为,该容器存储的全部都是键 key 和值 value 相等的键值对,正因为它们相等,因此只存储 value 即可)。另外,该容器存储的元素不能重复,且容器内部存储的元素也是无序的。存储键值对 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的。1、无序容器内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键,无序容器的底层实现采用的是哈希表的存储结构。原创 2023-07-30 18:29:11 · 69 阅读 · 0 评论 -
C++[第四十三章]--multimap和set
set 容器存储的各个元素的值必须各不相同。更重要的是,从语法上讲 set 容器并没有强制对存储元素的类型做 const 修饰,即 set 容器中存储的元素的值是可以修改的。但是,C++ 标准为了防止用户修改容器中元素的值,对所有可能会实现此操作的行为做了限制,使得在正常情况下,用户是无法做到修改 set 容器中元素的值的。注意,由于 retSet() 函数的返回值是一个临时 set 容器,因此在初始化 copyset 容器时,其内部调用的是 set 类模板中的移动构造函数,而非拷贝构造函数。原创 2023-07-30 18:29:03 · 21 阅读 · 0 评论 -
C++[第四十二章]--map
map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。map 容器定义在头文件中,并位于 std 命名空间中。原创 2023-07-30 18:28:48 · 45 阅读 · 0 评论 -
C++[第四十一章]--关联容器
在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C++ 基础数据类型或自定义类型的元素),它的功能是在使用关联式容器的过程中,如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。原创 2023-07-30 18:28:40 · 28 阅读 · 0 评论 -
C++[第四十章]--vector
vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。原创 2023-07-30 18:28:31 · 36 阅读 · 0 评论 -
C++[第三十九章]--list
双向链表容器,即该容器的底层是以双向链表的形式实现的list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。list 容器中各个元素的前后顺序是靠指针来维系的,每个元素都配备了 2 个指针,分别指向它的前一个元素和后一个元素。其中第一个元素的前向指针总为 null,因为它前面没有元素;同样,尾部元素的后向指针也总为 null。list 容器以模板类 list(T 为存储元素的类型)的形式在头文件中,并位于 std 命名空间中。原创 2023-07-30 18:28:17 · 20 阅读 · 0 评论 -
C++[第三十八章]--deque容器
deque 容器以模板类 deque(T 为存储元素的类型)的形式在 头文件中,并位于 std 命名空间中。注意:deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。原创 2023-07-30 18:27:59 · 26 阅读 · 0 评论 -
C++[第三十七章]--array容器
array 容器以类模板的形式定义在 头文件,并位于命名空间 std 中T 用于指明容器中的存储的具体数据类型,N 用于指明容器的大小,需要注意的是,这里的 N 必须是常量,不能用变量表示在创建 array 容器的实例时,也可以像创建常规数组那样对元素进行初始化。原创 2023-07-31 09:12:26 · 49 阅读 · 0 评论 -
C++[第三十六章]--序列容器
是一个长度可变的、由 T 类型元素组成的序列,它以双向链表的形式组织元素,在这个序列的任何地方都可以高效地增加或删除元素(时间复杂度都为常数阶 O(1)),但访问容器中任意元素的速度要比前三种容器慢,这是因为 list 必须从第一个元素或最后一个元素开始访问,需要沿着链表移动,直到到达想要的元素。和 vector 非常相似,区别在于使用该容器不仅尾部插入和删除元素高效,在头部插入或删除元素也同样高效,时间复杂度都是 O(1) 常数阶,但是在容器中某一位置处插入或删除元素,时间复杂度为 O(n) 线性阶;原创 2023-07-31 09:12:17 · 28 阅读 · 0 评论 -
C++[第三十五章]--容器概览
C++中的容器可以按照其内部实现的数据结构和特点进行分类。原创 2023-07-30 18:27:44 · 29 阅读 · 0 评论 -
C++[第三十四章]--锁
多线程中的锁主要有五类:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,所得功能与性能成反比。原创 2023-07-29 16:57:59 · 42 阅读 · 0 评论 -
C++[第三十三章]--线程同步
线程同步的常用方法包括以下几种:原创 2023-07-29 16:53:50 · 103 阅读 · 0 评论 -
C++[第三十二章]--小知识3(编译可见性)
使用__attribute__((visibility(“default”)))可以指定动态链接库中符号的可见性为默认,也就是仅在动态链接库内部可见。此外,还可以使用其他的可见性选项,例如hidden和protected等,来进一步限制符号的可见性。我们使用了__attribute__((visibility(“default”)))来将myfunc()的可见性限制在动态链接库内部。原创 2023-07-29 16:46:24 · 272 阅读 · 0 评论 -
C++[第三十一章]--tuple元组
一种类模板,命名为 tuple,tuple 最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。原创 2023-07-29 15:25:02 · 33 阅读 · 0 评论 -
C++[第三十章]--move()
arg 表示指定的左值对象。该函数会返回 arg 对象的右值形式。原创 2023-07-29 15:22:09 · 29 阅读 · 0 评论 -
C++[第二十九章]--lambda匿名函数
外部变量方位方式说明符] :[ ] 方括号用于向编译器表明当前是一个 lambda 表达式,其不能被省略,通过捕获列表来确定匿名函数调用时使用哪些外部变量。] 默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符)noexcept/throw():可以省略,如果使用,在之前的 () 小括号将不能省略(参数个数可以为 0)[=, &x] 变量x以引用形式捕获,其余变量以传值形式捕获。[&, x] 变量x以值的形式捕获,其余变量以引用形式捕获。原创 2023-07-29 15:05:12 · 43 阅读 · 0 评论 -
C++[第二十八章]--constexpr
我们知道,函数的使用分为“声明”和“定义”两部分,普通的函数调用只需要提前写好该函数的声明部分即可(函数的定义部分可以放在调用位置之后甚至其它文件中),但常量表达式函数在使用前,必须要有该函数的定义。如果 constexpr 修饰的模板函数实例化结果不满足常量表达式函数的要求,则 constexpr 会被自动忽略,即该函数就等同于一个普通函数。想自定义一个可产生常量的类型时,正确的做法是在该类型的内部添加一个常量构造函数。修饰函数的返回值,这样的函数又称为“常量表达式函数”原创 2023-07-29 15:02:45 · 32 阅读 · 0 评论 -
C++[第二十七章]--auto和decltype
auto 不能作用于类的非静态成员变量(也就是没有 static 关键字修饰的成员变量)中。exp 中调用函数时需要带上括号和参数,但这仅仅是形式,并不会真的去执行函数代码。用法:decltype(exp) varname = value;auto和decltype结合使用得到返回类型。auto 不能在函数的参数中使用。auto 关键字不能定义数组。auto 不能作用于模板参数。原创 2023-07-29 14:59:54 · 59 阅读 · 0 评论 -
C++[第二十六章]--智能指针
并且,由于该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为 0 时,堆内存才会被自动释放)。make_shared是标准库函数,此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。4、在初始化 shared_ptr 智能指针时,还可以自定义所指堆内存的释放规则,这样当堆内存的引用计数为 0 时,会优先调用我们自定义的释放规则。原创 2023-07-29 14:54:19 · 120 阅读 · 0 评论 -
C++[第二十五章]--小知识2(基于范围的for循环和using定义别名)
using 的别名语法覆盖了 typedef 的全部功能// 重定义unsigned int typedef unsigned int uint_t;// 重定义std::map typedef std :: map < std :: string , int > map_int_t;原创 2023-07-29 14:51:48 · 30 阅读 · 0 评论 -
C++[第二十四章]--PBO技术
PBO。原创 2023-07-27 20:49:01 · 48 阅读 · 0 评论 -
C++[第二十三章]--C++ 默认构造函数
在 C++ 中,如果一个类没有定义以下 5 种函数之一,编译器会自动生成它们的默认实现。原创 2023-07-27 20:42:05 · 45 阅读 · 0 评论 -
C++[第二十二章]--小知识(new、typeid、带默认参数的函数)
定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值。也就是说,调用函数时可以省略有默认值的参数。如果用户指定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。原创 2023-07-27 20:35:48 · 70 阅读 · 0 评论 -
C++[第二十一章]--内联函数
如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。(尽量不要内联超过 10 行的函数)原创 2023-07-27 09:14:00 · 32 阅读 · 0 评论 -
C++[第二十章]--异常
A捕捉B。原创 2023-07-26 19:52:05 · 82 阅读 · 0 评论 -
C++[第十九章]--类模板
【代码】C++[第十九章]--类模板。原创 2023-07-26 19:49:48 · 53 阅读 · 0 评论 -
C++[第十八章]--模板重载
参数不同。原创 2023-07-26 19:47:42 · 50 阅读 · 0 评论 -
C++[第十七章]--模板引入
参数类型为传值时忽略实参的const,volatile等属性,因为传值时,会临时生成一个变量,此变量可读可写。建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来表达。1、const :函数参数为非const引用/指针, 它可以隐式转换为const引用/指针。编译器根据函数参数a,b推导出模板参数为int,所以把模板中的T绑定为int;其他隐式转换都不支持,比如:算术转换、派生类对象向上转换、参数为“函数的名字” 时,它隐式转换为“函数指针”2、数组可以隐式转换为“指向第1个元素的指针”原创 2023-07-26 19:45:04 · 101 阅读 · 0 评论 -
C++[第十六章]--抽象类和纯虚函数
virtual函数声明时后面加上 “=0”如:virtual void eating(void) = 0;注意:纯虚函数不需要定义。原创 2023-07-26 19:41:59 · 41 阅读 · 0 评论 -
C++[第十五章]--强制类型转换
格式:reinterpret_cast (expression)相当于C风格的用小括号"(type-id)"实现的强制类型转换int。原创 2023-07-26 19:37:59 · 173 阅读 · 0 评论 -
C++[第十四章]--多态
对于虚函数,采用动态联编:有虚函数的对象里有一个指针,指向虚函数表;函数参数相同,但是返回值是当前对象的指针或引用时,也可以设为虚函数。调用虚函数时,会根据对象里的指针找到表,从表中取出函数来执行。对于非虚函数,采用静态联编:编译时就确定调用哪个函数。覆盖:函数参数、返回值相同,可以设为虚函数。5、重载:函数参数不同,不可设为虚函数。1、只有类的成员函数才能声明为虚函数。覆写:派生类重写基类的虚函数。4、析构函数一般都声明为虚函数。2、内联函数不能是虚函数。3、构造函数不能是虚函数。4、相同的返回值类型。原创 2023-07-26 19:34:40 · 66 阅读 · 0 评论 -
C++[第十二章]--构造顺序
C++[第十二章]--构造顺序。原创 2023-07-26 19:32:37 · 172 阅读 · 0 评论