自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 function函数对象类型的实现原理(一)

template<typename Type> // 进行主模板声明template<typename R, typename... Arg> // 偏特化模板声明 // ... 表示可变参public:private:FUNC func_;int main()使用可变参...去定义类模板注意需要将涉及到该参数的地方都进行更改。

2024-11-19 11:35:31 172

原创 智能指针(三)

使用强弱智能指针保证多线程访问共享对象的线程安全问题。

2024-11-18 11:33:29 300

原创 智能指针(二)

那么pb的引用计数不会增加。出作用域的时候,会调用析构函数释放资源。上述代码中,pa、pb交叉引用,导致。带引用计数的智能指针。

2024-11-18 10:57:54 481

原创 智能指针(一)

public:cout << "调用智能指针析构函数" << endl;++cnt_;--cnt_;

2024-11-14 12:31:58 415

原创 对象优化及右值引用优化(四)

对象优化及右值引用优化(四)对象优化的规则对象传参过程中,对象优先按照引用传递,不要按照值传递函数返回对象的时候,优先返回临时对象,而不要返回定义过的对象。返回临时对象不在调用函数内部构造临时对象,而是在main函数栈帧中构造临时对象;相比于在调用函数中定义对象,少了构造函数调用与析构函数调用。接收返回值是对象的函数调用的时候,优先按照初始化的方式接收,不要按照赋值的方式接收

2024-11-13 11:19:26 259

原创 对象优化及右值引用优化(三)

符号表示的引用类型,允许我们绑定到右值上。这使得我们可以直接操作右值所拥有的资源,而不是拷贝它们。

2024-11-13 11:00:21 248

原创 对象优化及右值引用优化(三)

符号表示的引用类型,允许我们绑定到右值上。这使得我们可以直接操作右值所拥有的资源,而不是拷贝它们。

2024-11-11 16:53:09 270

原创 对象优化及右值引用优化(二)

【代码】对象优化及右值引用优化(二)

2024-11-08 11:46:03 413

原创 对象优化及右值引用优化(一)

G++ 编译器,在函数返回对象时候会将创建的临时变量优化掉,导致不会调用对应的拷贝构造函数。g++编译的时候可以使用下面命令关闭掉。

2024-11-07 12:25:07 615

原创 泛型算法简要说明

sortpublic:int main()//利用函数对象更改排序行为});//利用lambda表达式(函数对象)更改排序行为数组有序的前提下,查找某个元素返回bool值int main()if (ret)cout << 31 << "存在" << endl;find查找某个元素返回迭代器int main()find_if根据某个条件查找元素并返回其迭代器int main()foreach遍历某个范围迭代器int main()

2024-11-06 11:34:51 657

原创 函数对象笔记

将函数指针传入compare时,编译器并不知道函数是什么。代码中使用C++中的模板,调用使用函数指针调用函数。指向一个函数的指针,可以动态调用不同的函数。,可以如同函数一样被调用。

2024-11-05 11:18:48 1057

原创 容器迭代器

const_iterator 继承自iterator。

2024-11-05 10:28:10 419

原创 容器适配器

擅长处理top K问题。

2024-11-04 11:00:03 382

原创 关联容器笔记

键值的顺序自动排序,键值必须支持操作符。

2024-11-03 18:54:28 344

原创 顺序容器对比

顺序容器vector特点动态数组内存是连续的以二倍大小进行扩容,其中reserve只进行空间的预留不创建元素而resize既修改空间大小又改变元素个数deque的特点底层为二维动态数组第二维数组空间大小固定扩容时,第一维数组的二倍进行扩容该二维数组的内存并不是连续的list的特点底层为双向循环链表删除添加时间复杂度O(1),访问的时候O(n)vector与deque底层数据结构不同前后数据插入的时间复杂度不同,vector,前O(n),后O(1);deque,前O

2024-11-03 16:59:33 259

原创 deque

当deque进行push_back,将下半部分空间元素添加满的时候会进行扩容,以原来空间二倍进行扩容。会以原来2倍空间开辟新的空间,并且将原数据复制到新的内存空间。deque进行push_front与push_back类似。

2024-11-02 12:33:32 417

原创 vector

动态数组,每次扩容以其原大小二倍进行扩容。

2024-11-01 10:52:47 301

原创 多重继承以及菱形继承

从Base继承而来的部分,被放在Drived。,该指针指向存放于末尾的Base的部分。,并且在内存首部使用了一个。

2024-10-31 17:02:12 481

原创 四种类型转换

当由基类指针转换成派生类的时候,会对指针指向内存的虚函数表指针指向的虚函数表中的运行时类型信息(RTTI)进行检查。如果通过检查则返回派生类对象地址,否则返回nullptr。因为b是常量,直接赋值给b是不符合C++语法的,因此需要通过const_cast进行转换。提供C++编译器认为安全的类型转换。基类类型与派生类类型的转换是支持的。没有任何联系的类型转换是不接受的。

2024-10-31 11:14:18 386

原创 OOP 一些例题

因为基类使用虚函数,所以调用show()的时候动态绑定。尽管派生类的show()函数是私有的,但是其地址是在虚函数表中,因此从虚表中调用派生类的show()函数。,编译器首先是否拥有函数访问权限。代码中,使用的是基类指针,所以编译器检查的是基类中show()的权限。而具体调用的show()是在。

2024-10-30 15:26:15 166

原创 基类派生类转换

继承结构中,默认只支持从下到上的转换。

2024-10-30 10:47:55 372

原创 成员函数重载与隐藏

重载隐藏覆盖重载一组函数名相同、参数列表不同的函数处在一个同一个作用域内c++编译器产生符号的机制与函数列表有关隐藏当派生类继承基类,基类与派生类有同名函数,那么使用派生类对象调用该函数的时候,基类的函数就被隐藏。举例#include <iostream>using namespace std;class Base {public: Base(){} ~Base(){} void look() { cout << "Base::l

2024-10-30 10:47:15 385

原创 派生类的构造过程

派生类的构造过程派生类通过调用基类的构造函数来初始化从基类继承的成员变量派生类的构造与析构函数负责初始化和清理派生类的部分;基类的构造和析构函数负责初始化和清理派生类的部分具体过程派生类调用基类的构造函数来初始化从基类继承的成员变量派生类调用自己的构造函数初始化自己的成员变量当派生类出作用域的时候,调用基类的析构函数清理从析构函数继承来的成员变量接着调用自己的析构函数清晰自己的成员变量

2024-10-29 11:35:40 417

原创 抽象类知识

当涉及到针对不同类型的的车时,它们因为剩余汽油的不同以及每升汽油的行程数不同导致汽车的剩余公里数不同。所以使用虚函数定义不同类型汽车得到的不同每升汽油行驶的公里数的函数。上述代码抽象出Car共有的两种属性,

2024-10-29 11:12:15 200

原创 OOP特性 继承

代码的复用。

2024-10-29 10:12:44 313

原创 OOP特性 多态

上述代码中,基类指针指向派生类对象并调用同名覆盖函数,此时调用的函数为派生类的void show()函数,实现多态。

2024-10-28 11:33:51 904

原创 动态绑定的发生

在构造函数中调用虚函数是不会发生动态绑定。那是由于基类的构造的时候派生类此时还没有没有构造,那么此时虚函数表内部的虚函数地址只是基类定义的虚函数地址,并没有对虚表进行虚函数地址更改。虚函数通过指针或者引用调用才发生动态绑定下述代码是通过引用调用虚函数的反汇编代码

2024-10-28 11:00:28 452

原创 虚析构函数

虚函数指针(通常称为虚表指针或vptr)在对象的构造过程中创建。当delete p的时候,有只析构基类不析构派生类的风险。​ 静态成员方法不依赖对象。

2024-10-27 22:49:29 364

原创 虚函数静态绑定与动态绑定

编译器发现,void show()为。

2024-10-27 22:07:03 291

原创 IteratorBase

通过IteratorBase记录迭代器。

2024-10-26 13:21:19 177

原创 迭代器的失效问题

【代码】迭代器的失效问题。

2024-10-26 12:33:41 320

原创 vector与string的迭代器

它接收的参数为迭代器所以它有一套方式可以同意遍历各种容器的所有元素。泛型算法是一套全局函数,其可以给所有容器都可以使用。迭代器一般实现成容器的嵌套类型。

2024-10-25 10:45:22 301

原创 String的运算符重载

主要对String类的=、< 、>、==、+、>>运算符进行重载。

2024-10-24 16:16:29 451

原创 运算符重载

某类对于二元运算符的成员函数的重载,比如+、-、*、/、=。<<, >>**作为友元函数进行重载。但是对于 **<<, >>上述代码中编译器会将。

2024-10-24 15:54:28 615

原创 new、delete重载实现对象池

当有大量的开辟空间与释放空间的操作时,会影响程序的执行性能。因此,可以预先开辟出一块内存,需要创建对象的时候去取,需要释放的时候,归还内存。那么程序的性能会有提升。静态成员变量,在结构体外定义的时候,如果出现以上代码,那么就会出现。模板类Queue主要实现了一个链式队列。

2024-10-23 23:52:50 372

原创 深入理解new、delete

对于编译器自带内嵌的数据类型,比如int、double等,使用new与delete与malloc与free一样。由于new对象的时候,将创建的个数存储,方便构造与析构。malloc通过返回指针是否为空判断内存是否分配成功;new通过异常的判断判断内存是否分配成功。malloc再分配内存的时候不对内存进行初始化;new分配内存的时候也对内存进行初始化。new返回的是 T*malloc是按照字节大小进行内存分配的,new是按照类型进行内存分配的,本质上是函数,使用的时候是对。malloc与new的区别。

2024-10-23 13:09:29 349

原创 空间配置器allocator

构造容器的时候使用new导致分配内存的同时也调用构造函数,析构容器的时候使用delete将所有的元素进行析构。我们想要的是在使用容器的时候,如果没有元素入栈,就不会进行多余的构造;同时对容器进行析构时,也仅仅析构仅有的几个元素。public:vector(const vector<T>& rhs) // 容器的拷贝构造函数i < len;i++)vector& operator=(const vector<T>& rhs) // 赋值运算重载i < len;i++)

2024-10-22 12:21:38 1048

原创 实现简易vector容器

【代码】实现简易vector容器。

2024-10-22 10:48:40 147

原创 函数模板详解

所以模板代码调用之前,一定要看到模板定义的地方,这样模板才能进行实例化,产生能够被编译器编译的代码。因此,模板代码都放在头文件种,之后被源文件#include包含。,当同样的名字没有指定类型的时候,编译器会默认使用普通函数,只有指定了类型才会将其看作函数模板,然后检查是否有其特例化函数。使用上述代码的逻辑则会不符合我们开发得需要,因此需要模板的特例化。模板的特例化不是编译其提供的,而是开发者提供的。上述的函数模板,可以进行。模板是不参与编译的。

2024-10-21 22:00:06 611

原创 数据报套接字

使用数据报套接字监听某个端口时,会监听出一些其他数据。,确保只处理符合预期格式的数据。为了处理这些情况,你可以在。

2024-10-21 20:12:31 150

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除