
C++深入学习
文章平均质量分 74
提高级
白糖熊
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【C++】malloc 和 new 的区别
new/delete是C++关键字(运算符),需要编译器支持。是库函数,需要头文件支持。使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。new申请的空间可以初始化malloc申请的空间不会初始化new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。原创 2022-10-19 17:46:41 · 622 阅读 · 2 评论 -
【C++】理解C++和C的区别
人.放衣服(方法)-> 人.加洗衣粉(方法)-> 人.加水(方法)-> 洗衣机.漂洗(方法)-> 洗衣机.清洗(方法)-> 洗衣机.甩干(方法)有些C头文件被转换成C++头文件,这些文件被重新命名,去掉了扩展名h,并在文件名称前面加上前缀c(表示来自C语言)1.const修饰的变量,必须初始化,因为在编译阶段,会被替换成常量,如果不初始化,后面将没有机会对其赋值。易维护,有封装,继承,和多态的特点。,可以看出,用一个变量往另外一个变量中赋值,也是解引用。指针可以改变 a的值,而c++中不行。原创 2022-10-18 18:26:46 · 515 阅读 · 0 评论 -
【C++】C/C++的区别(待补充)
为了解决命名冲突:比如防止多个程序员写代码中使用的全局函数名,变量名发生冲突。为了解决全局污染问题,防止程序中的全局实体名,和其他程序中的全局实体名冲突。using声明以关键using开头,后面是被限定修饰的名字空间成员名。所有的内置类型都可以用{}进行初始化。{}没有值,则默认为0。因为:函数的调用也是a(),会造成不清楚。使用using声明可以只写一次限定修饰名。才可以使用该命名域中的函数和变量。那么在b.cpp文件中就需要 使用。函数中不可以定义命名空间。原创 2022-10-19 17:50:25 · 289 阅读 · 0 评论 -
函数默认值,内联函数,函数重载。
内联函数的处理方式就是直接在函数的调用点,直接将代码展开,就相当于直接把这个函数的函数体,直接复制了一份放在了当前调用点的位置,这样做的目的就是减少了函数调用中的开栈和清栈。重载函数通常用来在同一个作用域内 用同一个函数名 命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。不是所有情况都是用inline函数,因为是典型的空间换时间,但是如果inline函数过多,导致所在文件过于庞大,就会被当做普通函数处理。左边为普通的函数调用 ,右边为引用函数的调用。原创 2022-10-17 16:59:35 · 296 阅读 · 0 评论 -
引用,函数默认值,函数重载,模板 理解
引用:1,引用就是别名 (引用值的改变,其本身的值也会改变)2,引用必须要初始化3,也没有所谓的空引用4,没有引用的引用。int &x = a;int &c = a; x和c 都是a的别名 所以 int &&c = x 是不行的常引用(const):const int &c = a可以通过改变a的值而改变c但不能改变c的值int &b = a;b += 10; 则 a =10int a =10;const in原创 2022-03-01 09:22:33 · 196 阅读 · 0 评论 -
引用详解?
程序出现二义性,因为b可以改变而a不能改变,b又是a的别名。原创 2022-10-17 18:03:39 · 105 阅读 · 0 评论 -
【C++STL】迭代器
当我们对mutable iterator进行提领操作,获得的不应该是右值(rvalue),而应该是左值(lvalue),因为右值不允许赋值操作,左值才允许。任何一个打算和STL算法有完美搭配的class,都应该定义自己的value_type内嵌型别。Input_iterator :这种迭代器所指的对象,不允许外界改变,是只读的。左值,令它代表p所指之物的,是可能的,那么“传回一个地址”也一定可以。所谓value_type ,是指迭代器所指的对象的型别。如何设计出两者之间的良好的粘合剂,才是最大的问题。原创 2022-11-10 22:05:11 · 454 阅读 · 0 评论 -
【C++】lambda表达式
因此不能定义在主函数中。原因如下:main中没有x,sum,num,无法捕获。lambda定义在哪个函数内,就会捕获哪个函数内的局部变量。因为全局变量在任意位置都可以使用。因为捕获,是可以捕获函数中的任意量。对于全局变量,没有捕获的概念。lambda就是去替换仿函数。很明显:产生了副本。原创 2022-11-10 17:15:42 · 401 阅读 · 0 评论 -
【c++】deque和vector的区别,相关面试题
deque和vector的区别:原创 2022-11-08 22:03:23 · 510 阅读 · 0 评论 -
【C++STL】deque的结构和使用
deque是由一块一块的固定大小的连续空间构成(块与块之间是不连续的)。一旦有必要在deque的前端或者尾端增加新的空间,便配置一块固定大小的连续空间,串接在整个deque的头端或者尾端。deque 的最大任务,便是在这些分块的固定大小连续空间上,维护其整体连续的假象,并提供随机存取的接口(随机迭代器),代价则是迭代器架构较为复杂。deque 采用一块所谓的_M_map(不是STL的map容器)作为主控。原创 2022-11-08 16:04:13 · 778 阅读 · 0 评论 -
【C++STL】list的介绍 | vector和list的区别和使用场景
在平时使用时,不能谈论某个容器的优缺点,因为每种容器都有它适合的场景,只能说哪种容器在哪种场合更实用。vector底层实现是数组;list是双向链表。vector支持随机访问,list不支持。vector是顺序内存,list不是。vector在中间节点进行插入删除会导致内存拷贝,list不会。vector一次性分配好内存,不够时才进行2倍扩容(或1.5倍);list每次插入新节点都会进行内存申请。vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。原创 2022-11-07 21:11:15 · 648 阅读 · 0 评论 -
【C++】map和set的使用
如果需要对关键码进行排序,则使用,map,不需要则也可以使用unordered_map。原创 2022-11-09 15:34:02 · 119 阅读 · 0 评论 -
【C++STL】vector的使用,相关方法详解和注意点
必须使用Shape,因为只有基类的指针或引用才可以访问派生类的成员*)原创 2022-11-07 18:29:36 · 292 阅读 · 0 评论 -
【C++STL】vector的介绍和使用
是否是使用引用和const,取决于使用目的。容器中的数据是否需要修改,是内置类型还是设计类型,等等。for(;it3!it3 ++) //const修饰的是整个迭代器,修饰的是it3本身 it3++ error {//所以其指向的值可以变,但是其本身不能变 cout Value()原创 2022-11-06 16:44:22 · 504 阅读 · 0 评论 -
【C++】菱形继承和虚继承
用两种方式去分别继承Base和Test类,因此Object中的虚表指针,在指向Det中的虚表时,有两个,一个继承Base中的虚表,另一个是继承test中的虚表。2.base用double类型继承,test用int类型继承,会推演出两个模板,自然而然,在各自的类型模板中,对静态成员变量只初始化一次。在Det的对象中Object成员会有两份。当虚继承的派生类被当做基类再次虚继承,虚基类指针也会被继承。Object基类中的虚表指针,开始指向Object中的虚表,虚继承:主要是通过虚继承,在。原创 2022-11-05 20:54:26 · 799 阅读 · 0 评论 -
【C++】函数重载和模板函数之间的问题|完美转发的概念
迭代器失效,怎么解决?C。原创 2022-11-04 23:04:58 · 127 阅读 · 0 评论 -
【C++智能指针】(面试)使用my_weak_ptr解决循环引用问题
1.判断parent中的_Rep是否为空,以及引用计数类型中的_Uses减一是否为0,如果为0,删除parent中_Parent指针所指的parent对象,由于parent中有weak_ptr的对象c,c中有_Rep指针,指向child对象中_Rep指向所指的引用计数结构。3.接下来回退到child对象,将child的引用计数结构中的_weaks减一,若_weaks为0,则将child的引用计数结构析构掉,否则,回退到child,将其_ptr和_Rep均置为空。原创 2022-11-04 17:56:28 · 374 阅读 · 0 评论 -
【c++智能指针】模拟带有weak_ptr的shared_ptr
【查询x86指令集,原子操作】引用计数类型成员变量:1、指向对象的指针2、强引用计数3、弱引用计数my_shared_ptr类的设计构造函数:析构函数拷贝构造函数移动构造函数普通赋值返回持有当前资源的指针个数交换资源函数bool运算符重载模拟my_weak_ptr只有一个Rep指针,指向引用计数原创 2022-11-03 22:37:28 · 178 阅读 · 0 评论 -
【c++智能指针】模拟实现my_shared_ptr
其实c11新引入的移动赋值和移动构造都是"右值引用"的概念的产生而产生,实际针对的是对对资源和系统内部资源进行转移引入的引入的一个新的概念。(实现的是资源的转移)原创 2022-11-02 20:42:06 · 1011 阅读 · 0 评论 -
【c++】初始化列表的使用场景
在进入构造函数之前是对成员属性的初始化,进入之后是赋值操作,很明显赋值和初始化是不同的,如果不使用初始化列表,类就会对自己的成员,隐式调用默认构造进行初始化,以及调用一次赋值运算符的,如果这样做,效率是不能保障的。构造函数要初始化的数据成员,不论是否显式的出现在构造函数的初始化列表中,都会在该处完成初始化,并且初始化的顺序和类中的声明是一样的。因为已经有了有参构造,所以不会产生无参构造,因此如果没有显示的区调用有参构造构建Object对象进行初始化,就没有办法再创建对象,所以错误。比如:这样写就是错误的。原创 2022-11-01 10:48:16 · 469 阅读 · 0 评论 -
【C++智能指针】实现unqiue_ptr
old指向当前指针所指对象(如果不这样做,会导致指针所指的对象不能被删除)是否使用内联,取决于系统需不需要节省开栈清栈的时间。将资源转移给old,然后自身指针置为空。当前指针指向新的指针所指的对象。在调用删除器删掉old。原创 2022-11-01 00:22:14 · 543 阅读 · 0 评论 -
【C++智能指针篇】详解unique_ptr,类模板,使用场景和部分功能
unique_ptr: 拥有独有对象所有权语义的智能指针。原创 2022-10-31 18:08:42 · 2879 阅读 · 0 评论 -
【C++】RAll,裸指针,弃用auto_ptr原因
使用局部对象****来管理资源的技术称之为资源获取即初始化。这里的资源主要是指操作系统中有限的东西,如:内存,网络套接字,互斥量,文件句柄等等,局部对象实质存储在栈的对象。它的生命周期是由操作系统管理的。无需人工的介入。int * ip;//未初始化,野指针 int * ip = NULL;//裸指针 Object * op = NULL;//裸指针 }通俗的讲,凡是带*并且初始化的都是裸指针。1.难以区分指向的是单个对象还是一组对象。原创 2022-10-30 23:48:22 · 2103 阅读 · 4 评论 -
【c++】类模板
模板类型,就是在创建对象的时候,必须在类名的后面用。语法:类名 对象的方式说明类的类型非类型会被替换,类型遵循重命名规则。1.在类中给出的函数都是模板函数。2.如果没有调用这个函数,那么编译器不会对此函数进行实例化。3.模板类的成员函数包括在一个头文件中,两者不能分离,编译器做不到,因此依附关系过于复杂。4.new:对于自己设计的类型,不仅要开辟T个空间,还要调用构造函数对每个空间构造对象。非常麻烦。ar调用fun(),可以改变堆区的值吗?答:可以。原创 2022-10-30 16:43:45 · 87 阅读 · 0 评论 -
【C++】抽象类和虚基类,虚函数和纯虚函数
3.带纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重写虚函数后,才能使用,也叫抽象类,抽象类和虚继承基类还是有区别的,在C#中用abstract定义抽象类,在c++中有抽象类的概念,但是没有这个关键字。,其实在函数的前面加virtual是很好的,虽然牺牲了一些函数的性能,但是增加了面向对象的多态性,因为很难预料父类里面的这个函数不会在子类中去修改它的实现。1.类里面声明了虚函数,虚函数是可以定义的,还可以空定义。在一个抽象类中,只有方法类的集合,即只有纯虚函数的列就叫做接口。原创 2022-10-29 19:25:39 · 2319 阅读 · 0 评论 -
【C++】动态联编、delete/free【有无析构】的使用,虚析构
当有基类指针指向派生类的对象,如果基类和派生类都有析构函数,那么析构op指向的base对象时,使用的是基类的析构函数,。是先new一个base对象,先构造隐藏基类对象,使其内的虚表指针指向Object的虚表,当在此对base实例化时,基类的虚表指针会指向Base的虚表。当析构完Base中的资源,如果不把虚表指针指向Object的虚表,那么析构Object的时候,会再次析构Base中的add(),从而导致重复析构。:调用object类中的构造函数,创建隐藏基类对象,让该对象内保存的虚表指针,指向虚表。原创 2022-10-29 18:32:13 · 878 阅读 · 0 评论 -
【C++】C语言(结构体)简单模拟动态联编
将对应的函数赋值给对应的函数指针,再利用形状指针指向圆形和方形结构体的地址,实现动态联编。原理:设计一盒函数指针,代表形状的结构体,方形和圆形的结构体,分别计算面积。首先:设计一个方法来输出方形和圆形的面积。3.表示圆形和方形的结构体。1.设计一个函数指针。2.表示形状的结构体。//代表形状的结构体。原创 2022-10-29 14:37:50 · 462 阅读 · 0 评论 -
【C++】多态/虚函数/虚表指针,虚表
多态分为定义:虚函数是一个类的成员函数。语法: 返回类型 函数名参数列表()关键指明该成员为虚函数,仅用在类的定义中,如果虚函数在类外定义可以不加。当某一个类的成员函数被定义为虚函数,那么由该类派生出来的所有派生类,该函数都保持虚的特征。实现动态联编的注意点:1.必须使用公有继承2.类中的类方法必须是虚函数3.要实现运行时的多态,必须用指针或者引用来调用虚函数。原因:因为私有继承不代表是一个的意思)就是外部函数无法访问派生类的私有和保护属性。比如:猫是动物的一种。只有类的成员函数才能被说明为原创 2022-10-27 23:42:06 · 843 阅读 · 0 评论 -
【C++】模拟String,柔性数组,运算符重载,写实拷贝
Struct Node 用于模拟String。原创 2022-10-27 16:18:57 · 355 阅读 · 0 评论 -
【C++】继承/基类和派生类(赋值兼容性规则)/同名隐藏/切片问题
引用其实就是基类引用派生类中隐藏基类对象中的值。如:Object & obja = base;-- -- -- 》 obja是隐藏基类对象的别名。原创 2022-10-27 00:13:01 · 1812 阅读 · 0 评论 -
【C++】模拟STL容器,浅拷贝和内存泄漏
由于sq调用拷贝构造函数,没有申请额外的空间,导致sq和se指向同一个堆空间。原创 2022-10-26 11:28:59 · 240 阅读 · 0 评论 -
【C++】使用类来模拟string
/类外没有this指针,需要在定义一个对象s s原创 2022-10-25 23:32:15 · 484 阅读 · 0 评论 -
【C++】类的组合(以值类型组合)(指针类型组合)(引用类型组合)
整型赋值给设计的Int类型,先要构造一个Int类型,()需要在调用一次构造函数),再通过等号运算符重载赋值给val。这种组合叫弱关联,原因是指针指向所设计的类型对象,可能还能指向其他对象。:调用Object中的构造函数,num = x。:调用了Int中的构造函数,对Int中的value初始化,表示:调用类Object的构造函数,将x的值赋给num。表示:调用类Int的构造函数,将y的值赋给value。没有调用赋值运算符重载。(没有在调用一次构造函数)这种组合叫强引用关联。这种组合叫做强关联。原创 2022-10-25 17:00:10 · 440 阅读 · 0 评论 -
【C++】使用对象自动管理指针(用到运算符重载)
Int。原创 2022-10-25 15:04:53 · 405 阅读 · 0 评论 -
【C++】友元和静态成员
友元可分为如果一个类是另外一个类的友元,那么这个类中的方法就可以访问另外一个类中的私有和保护成员属性。静态成员(为单例模式做准备)静态成员:重点:正确:注意:也不能打印value,静态成员方法只能使用静态成员变量。不能访问到非静态成员属性,原因是没有this指针的存在,没办法访问到某个对象(this指针指向对象,对象才能访问类中的成员属性)。原创 2022-10-24 22:21:02 · 703 阅读 · 0 评论 -
【C++】函数模板(泛化,部分特化,完全特化)和模板函数
宏定义:在预编译期,进行简单的宏替换优点:代码复用性强缺点:缺少类型检查函数模板:用于泛型编程,(不考虑数据类型进行编程的方式)函数模板通常用:template声明开始进行泛型编程。typename用于声明泛指类型主要作用:提高代码的通用性。原创 2022-10-24 20:23:51 · 481 阅读 · 0 评论 -
【C++】右值引用、移动构造函数
能够用&取地址的表达式是左值表达式左值可以修改左值可以放在等号的左右两边。int b = a)a就是左值。如:函数名和变量名,返回左值引用的函数调用,前置自增、自减(++i,–i)由赋值运算符或符合运算符连接的表达式(a=b,a+=b,a%=b),解引用表达式*p,字符串字面值"abc"原创 2022-10-24 18:35:57 · 1092 阅读 · 0 评论 -
【C++】运算符重载/函数的返回值为解引用
函数的返回值为解引用?原创 2022-10-24 11:53:26 · 1544 阅读 · 0 评论 -
【C++】拷贝构造函数【浅拷贝/深拷贝】
如果直接用。原创 2022-10-23 21:13:07 · 790 阅读 · 0 评论 -
【c++】构造函数和析构函数{生可带来,死不带去}
有空间不一定有对象,必须要调用构造函数创建对象。有对象才可以对空间进行操作。原创 2022-10-20 17:43:51 · 700 阅读 · 1 评论