![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 83
努力学习的小赵同志
这个作者很懒,什么都没留下…
展开
-
详解—C++[智能指针]
什么是内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.原创 2023-12-23 14:46:24 · 971 阅读 · 0 评论 -
详解—C++ [异常]
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。3. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。(这里的处理类似于函数的传值返回)2. 返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那么我们得层层返回错误,最外层才能拿到错误,具体看下面的详细解释。原创 2023-12-19 19:41:01 · 984 阅读 · 0 评论 -
详解—【C++】lambda表达式
比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量 [&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量 c. 捕捉列表不允许变量重复传递,否则就会导致编译错误。实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator()。函数对象,又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了operator()运算符的类对象。原创 2023-12-15 14:41:19 · 1129 阅读 · 0 评论 -
详解—C++右值引用
而临时对象也是右值,因此在用临时对象构造s3时,也采用移动构造,将临时对象中资源转移到s3中,整个过程,只需要创建一块堆内存即可,既省了空间,又大大提高程序运行的效率。2. const修饰的常量,不可修改,只读类型的,理论应该按照右值对待,但因为其可以取地址(如果只是const类型常量的定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间),C++11认为其是左值。C++98中引用作用:因为引用是一个别名,需要用指针操作的地方,可以使用指针来代替,可以提高代码的可读性以及安全性。原创 2023-12-14 19:30:36 · 2690 阅读 · 0 评论 -
详解C++位图/布隆过滤器+海量数据处理
当删除一个元素时,将其加入到B中。近似算法:可以使用布隆过滤器的方法,先将一个文件中的所有query插入到一个布隆过滤器中,然后遍历另一个文件中的query,用布隆过滤器检查是否可能存在于第一个文件中。1.我们常规的方法,直接遍历,时间复杂度O(N),但是40亿个数中寻找一个数,无异于大海捞针,直接遍历所消耗的时间还是很多,更别说我们用什么来存储这40亿个数❌。,这样其他比特位都是0,如果测试的比特位是1,则结果是非0,那就是true,如果测试的比特位是0,则结果是0,那就是false。原创 2023-12-12 09:29:27 · 979 阅读 · 0 评论 -
详解—C++三大特性——多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。原创 2023-11-27 17:21:16 · 960 阅读 · 0 评论 -
详解——菱形继承及菱形虚拟继承
1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的语言都没有多继承,如Java。原创 2023-11-23 10:05:29 · 214 阅读 · 0 评论 -
C++三大特性——继承
5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。1. 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。下面我们看到Person是父类,也称作基类。原创 2023-11-23 08:40:08 · 44 阅读 · 0 评论 -
(C++ STL) 详解vector模拟实现
这是官方的文档介绍1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。原创 2023-10-16 23:40:51 · 209 阅读 · 0 评论 -
我是你的,你却不是我的——友元(c++)
比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。🎈友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。如果B是A的友元,C是B的友元,则不能说明C时A的友元。🎈友元函数可访问类的私有和保护成员,但不是类的成员函数。原创 2023-02-09 09:21:53 · 109 阅读 · 2 评论 -
详解-赋值运算符重载(C++)
🎈C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。🎈函数名字为:关键字operator后面接需要重载的运算符符号。🎈函数原型:返回值类型 operator操作符(参数列表)注意:🎈1.不能通过连接其他符号来创建新的操作符:比如operator@🎈2.重载操作符必须有一个类类型或者枚举类型的操作数🎈3.用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义。原创 2023-02-08 16:01:50 · 3520 阅读 · 3 评论 -
详解 - C++引用
🎈以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。🎈引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。🎈2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。🎈注意:引用类型必须和引用实体是同种类型的。原创 2023-02-05 16:03:02 · 127 阅读 · 0 评论 -
【C++天选之子】构造函数|析构函数
🎈对于Date类,可以通过SetDate公有的方法给对象设置内容,但是如果每次创建对象都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?🎈构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。原创 2023-02-05 14:13:56 · 74 阅读 · 0 评论