- 博客(57)
- 收藏
- 关注
原创 function函数对象类型的实现原理(一)
template<typename Type> // 进行主模板声明template<typename R, typename... Arg> // 偏特化模板声明 // ... 表示可变参public:private:FUNC func_;int main()使用可变参...去定义类模板注意需要将涉及到该参数的地方都进行更改。
2024-11-19 11:35:31
172
原创 对象优化及右值引用优化(四)
对象优化及右值引用优化(四)对象优化的规则对象传参过程中,对象优先按照引用传递,不要按照值传递函数返回对象的时候,优先返回临时对象,而不要返回定义过的对象。返回临时对象不在调用函数内部构造临时对象,而是在main函数栈帧中构造临时对象;相比于在调用函数中定义对象,少了构造函数调用与析构函数调用。接收返回值是对象的函数调用的时候,优先按照初始化的方式接收,不要按照赋值的方式接收
2024-11-13 11:19:26
259
原创 对象优化及右值引用优化(一)
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
原创 顺序容器对比
顺序容器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
原创 四种类型转换
当由基类指针转换成派生类的时候,会对指针指向内存的虚函数表指针指向的虚函数表中的运行时类型信息(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
原创 成员函数重载与隐藏
重载隐藏覆盖重载一组函数名相同、参数列表不同的函数处在一个同一个作用域内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
原创 动态绑定的发生
在构造函数中调用虚函数是不会发生动态绑定。那是由于基类的构造的时候派生类此时还没有没有构造,那么此时虚函数表内部的虚函数地址只是基类定义的虚函数地址,并没有对虚表进行虚函数地址更改。虚函数通过指针或者引用调用才发生动态绑定下述代码是通过引用调用虚函数的反汇编代码
2024-10-28 11:00:28
452
原创 虚析构函数
虚函数指针(通常称为虚表指针或vptr)在对象的构造过程中创建。当delete p的时候,有只析构基类不析构派生类的风险。 静态成员方法不依赖对象。
2024-10-27 22:49:29
364
原创 vector与string的迭代器
它接收的参数为迭代器所以它有一套方式可以同意遍历各种容器的所有元素。泛型算法是一套全局函数,其可以给所有容器都可以使用。迭代器一般实现成容器的嵌套类型。
2024-10-25 10:45:22
301
原创 运算符重载
某类对于二元运算符的成员函数的重载,比如+、-、*、/、=。<<, >>**作为友元函数进行重载。但是对于 **<<, >>上述代码中编译器会将。
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
原创 函数模板详解
所以模板代码调用之前,一定要看到模板定义的地方,这样模板才能进行实例化,产生能够被编译器编译的代码。因此,模板代码都放在头文件种,之后被源文件#include包含。,当同样的名字没有指定类型的时候,编译器会默认使用普通函数,只有指定了类型才会将其看作函数模板,然后检查是否有其特例化函数。使用上述代码的逻辑则会不符合我们开发得需要,因此需要模板的特例化。模板的特例化不是编译其提供的,而是开发者提供的。上述的函数模板,可以进行。模板是不参与编译的。
2024-10-21 22:00:06
611
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人