- 博客(21)
- 收藏
- 关注
原创 (STL标准模板库)4.分配器概述、使用
经过测试,allocator这个C++标准库提供的缺省的内存分配器没有采用内存池的工作原理,可能直接调用了malloc()。内存分配器扮演内存池的角色,通过大量减少对malloc()的调用,来节省内存,甚至还有一定的分配效率的提高。如果采用内存池原理,周围不可能被删除这么多内容,基本可以断定其没有采用内存池的工作原理。一般写代码很少用,但语法上,它也是能够直接使用的。也是分配器中的重要函数,用来释放内存,需要记住分配的对象数量以释放正确大小的内存。是分配器中的重要函数,用来分配一段原始的未构造的内存。
2025-02-18 20:43:03
223
原创 头文件互相引用导致报错
若直接使用对象(B b;),必须包含对方的完整定义,此时循环包含会导致编译失败。时,编译器在处理时会陷入无限递归或跳过部分内容。若仅使用指针(B* / A * ),可通过前置声明避免包含头文件。中未完全定义的类或结构体,编译器会因类型未声明而报错。的完整定义,编译器无法确定类型的实际大小和布局,导致。适用场景:仅在头文件中使用对方类型的指针或引用时。)中仍需包含对应的头文件以获取完整定义。中的完整定义(而非指针或引用),而。前置声明(不完整类型)的完整定义,会导致错误。的完整定义,会导致错误。
2025-02-18 00:15:00
573
原创 类基类指针、纯虚函数、多态性、虚析构
动态绑定类型转换与继承静态类型和动态类型派生类对象及派生类向基类的类型转换不存在从基类向派生类的隐式类型转换在对象之间不存在类型转换虚函数派生类中的虚函数派生类向基类转换的可访问性override和final说明符虚函数与默认实参C++的多态性纯虚函数虚析构函数
2025-02-17 00:15:00
1000
原创 (STL标准模板库)3.容器的说明和简单应用[deque,queue,stack,list,forward_list,set,map]
deque,queue和stacklist,forward_listset/map关联容器额外的类型别名mappair类型set类型
2025-02-17 00:15:00
1370
原创 C++类的继承
通过联系在一起的类构成一种层次关系。通常在层次关系的根部有一个,其他类则直接或间接地从基类继承而来,这些继承得到的类称 为。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。派生类必须通过使用类派生列表明确指出它是从哪个(哪些)基类 继承而来的。Quote尽管在派生类对象中含有从基类继承而来的成员,但是派生类并不能直接初始化这些 成员。和其他创建了基类对象的代码一样,派生类也必须使用基类的构造函数来初始化它的基类部分。每个类控制它自己的成员初始化过程。
2025-02-15 17:47:07
404
原创 类的成员函数
在调用成员函数时,编译器负责把该对象的地址传递给这个成员函数中的一个隐藏的this形参。在成员函数内部,任何对类成员的直接访问都被看 作this的隐式引用,也就是说this->meber(代表类成员)等价于meber(代表类成员)。其左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型 的一个成员名,运算结果为右侧运算对象指定的成员。在const成员函数中,this指针是一个指向const对象的const指针(类型为Time,this就是const Time*const this类型的指针)
2025-02-15 17:44:22
925
原创 类拷贝构造函数和析构函数
每个成员的类型决定了它如何拷贝:对类类型的成员,会使用其拷贝构造函数来拷贝;当使用直接初始化时,我们实际上是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。当我们使用拷贝初始化时,我们要求编译器将右侧运算对象拷贝到正在创建的对象中,如果需要的话还要进行类型转换。一般情况,合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中。如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值, 则此构造函数是拷贝构造函数。析构函数是类的一个成员函数,名字由波浪号接类名构成。
2025-02-15 17:43:11
266
原创 类构造函数
构造函数初始值是成员名字的一个列表,每个名字后面紧跟括号括起来的(或者在花括号内的)成员初始值。因为编译器会创建构造函数编译器创建的构造函数又被称为合成的默认构造函数。编译器会认为你在声明一个名为 mytime 的函数:返回值类型:Time(你的自定义类)参数列表:空(() 表示无参数)=delete意思为删除的,通知编译器(以及我们代码的读者),我们不希望定义这些成员。图中含有默认实参的带三个参数的构造函数和只带两个参数的构造函数编译器无法做出区分。无论何时只要类的对象被创建,就会执行构造函数。
2025-02-15 17:40:04
559
原创 C++类基础
C++ 11 新标准规定, 可以为数据成员提供一个类内初始值。对类内初始值的限制: 放在花括号里, 或者放在等号右边,记住不能使用圆括号。如果我们使用 struct 关键字,则定义在第一个访问说明符之前的成员是 public 的;相反,如果我们使用 class 关键字,则这些成员是 private 的。类体由花括号包围形成了一个新的作用域。类体右侧的表示结束的花括号后必须写一个分号。定义在 private 说明符之后的成员可以被类的成员函数访问。定义在 public 说明符之后的成员在整个程序内可被访问。
2025-02-15 17:38:18
114
原创 C++函数
对于重载的函数来说,它们应该在形参数量或形参类型上有所不同。在上面的代码中,虽然每个函数都只接受一个参数,但是参数的类型不同。 不允许两个函数除了返回类型外其他所有的要素都相同。假设有两个函数,它们的形参列表一样但是返回类型不同,则第二个函数的声明是错误的://这里表示任意的返回值//错误,与上一个函数相比只有返回类型不同main函数不能重载名字修饰规则编译器在编译时对函数名字的改写方式C语言:简单只是在函数名字前增加下划线。
2025-02-14 22:15:11
921
原创 C++ new,delete深度认识
newnew类对象加不加括号的差别new具体做了什么delete具体做了什么new内存分配细节探秘重载类中operator new和operator delete重载类中的operator new[]和operator delete[]操作符重载全局operator new和operator delete函数(operator new[],operator delete[])定位new(placement new)问题代码定位new使用例子定位new的重载多种
2025-02-14 21:30:40
1017
原创 C++枚举类型
C++包含两种枚举:限定作用域的和不限定作用域的。C++11新标准引入了限定作用域的枚举类型(scoped enumeration).,定义限定作用域的枚举类型的一般形式是:首先是关键字enum class (或。如果enum是未命名的,则我们只能在定义该enum时定义它的对象。和类的定义类似, 我们需要在enum定义的右侧花括号和最后的分号之间提供逗号分隔的声明列表。中,枚举成员的名字遵循常规的作用域准则,并且在枚举类 型的作用域外是不可访问的。中,枚举成员的作用域与枚举类型本身的作用域相同。
2025-02-14 21:12:19
198
原创 externC
extern用于语言链接声明一个非C++的函数链接指示与头文件指向extern "C"函数的指针链接指示对整个声明都有效导出C++函数到其他语言重载函数与链接指示
2025-02-14 21:09:34
515
原创 C++异常
异常的基本含义异常的基本语法异常的基本流程异常的优势C语言处理异常的方法的缺陷C++异常的优势异常严格类型匹配异常的接口声明栈解旋异常对象的生命周期异常的多态C++标准异常库
2025-02-14 20:40:34
800
原创 类(C++)
类基础结构访问控制与封装类内初始值构造函数概念特性合成的默认构造函数重载构造函数构造函数初始化列表=default=delete拷贝构造函数合成拷贝构造函数拷贝初始化析构函数类的成员函数const成员函数可变数据成员(mutable)this返回自身的引用类的静态成员声明静态成员定义静态成员使用静态成员编辑标准库move函数移动对象移动移动构造函数移动赋值运算符合成的移动操作继承
2025-02-13 11:58:34
1199
原创 (C++)const关键字的顶层和底层忽略不忽略
从C语言到C++,我想被const属性的有没有,是否被忽略折磨的人应该有吧,我也是其中之一,今天学习auto的时候提出的一系列疑问让这篇博客出现了。书上关于auto的介绍是auto一般会忽略顶层const,而下面的代码让我感到疑惑而cr理应是底层const吧,这里的理解倒是不难,因为auto不知道你是赋值还是引用所以推断个int也合情合理。但是我当时想到的是const的顶层底层到底为什么忽略和不忽略呢?
2023-09-08 12:28:41
86
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人