自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 类型模板参数与非类型模板参数

类型参数是指定模板类型名称的参数,而非类型参数是指定模板整型常量的参数。模板参数不限定于类型,普通值也可作为模板参数,但这里值的类型只能是。,同时传参时也只能是。

2024-10-05 16:40:15 183

原创 C语言的动态内存管理

动态内存分配涉及到四个函数,malloc,calloc,realloc,free,接下来会具体去讲解这四个函数。常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)。堆区:动态开辟的空间存放的数据放在这里,与malloc,realloc,calloc,free函数相关。在我们的内存中,可分为。代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。栈区:存放局部变量,函数的形式参数等临时的数据。栈区,堆区,静态区,代码区,常量区,

2024-09-23 17:07:30 457

原创 #联合体#

联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间,地址一样(所以联合也叫共用体)。

2024-09-23 14:30:38 230

原创 结构体易忘点

2.提高效率,对齐后的数据只需要访问一次,未对齐的数据要访问两次(32bit位的电脑一次只能访问4个字节,有些数据就会被两次分开访问)。(4)当存在嵌套结构体的情况,在放置结构体时,结构体的对齐数是所有成员变量(包含嵌套结构体的成员变量)的所占字节数最大值的整数倍。结构体里面的成员有一定的对齐规则,他不是每一个空间都存着有效数据的,有些空间是被浪费的,并且不能被访问。:成员自身大小与默认对齐数的较小值,vs默认对齐数8,gcc无默认对齐数。(3)对齐后的整体所占字节数要为所有成员中对齐数最大的整数倍。

2024-09-19 23:47:11 301

原创 纯虚函数和抽象类

派生 类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。抽象类不能实例化出对象。派生类继承后也不能实例化出对象,在虚函数的后面写上 =0 ,则这个函数为纯虚函数。

2024-07-26 15:15:56 256

原创 多态的概念及条件

因为析构函数会被编译器特殊处理,被处理成去调用 destructor()+operator delete()。多态:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;协变:虚函数的返回值可以不同,但是必须是父子类关系(其他父子类关系也可以)的指针或引用。(2)父类函数必须是虚函数,意思是有virtual关键字修饰。(1)有三同,返回值,参数,函数名相同。所以其实他们的函数名本质上是一样的。

2024-07-26 11:51:07 224

原创 继承(下)

在实践当作,选择组合还是继承主要看两个类是属于什么关系在public继承方式下,子类与基类是is-a的关系,可以说子类就是一个基类组合类之间是has-a的关系。如果两种关系都满足,优先选择组合。组合的耦合度更低。

2024-07-25 14:40:17 296

原创 继承(中)

实现一个不能被继承的类,或者说继承无意义的类,有两种方法。理解:爸爸的房子以后是你的,但爸爸的朋友不是你的朋友。也就是说基类友元不能访问子类私有和保护成员。子类访问的静态成员与父类的静态成员是同一个。静态成员与成员函数的继承类似,只。(2)final关键字——直接。(1)构造函数私有化——间接。子类可以访问父类的静态成员。静态成员要在类外面初始化。

2024-07-25 12:03:50 147

原创 继承(上)

2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏, 也叫重定义。,也不提倡 使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里 面使用,实际中扩展维护性不强。3. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过。,在派生类中不可见,这里的不可见是指基类的私 有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不可见。这里有个形象的说法叫。

2024-07-23 12:49:08 559

原创 模板的特化

在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特 化中分为函数模板特化与类模板特化。

2024-07-22 17:37:11 260

原创 list迭代器的实现

一个list容器的成员变量有 _head(指向头节点),_size(数据个数)每一个链表的结点是一个结构体,具体如下通过封装,让我们可以用简单统一的方式去访问容器。迭代器的基本使用通过分析上图,我们可以得到,迭代器的封装既是去实现1.取begin()与end()2.==与!2.迭代器的解引用,*it3.++it所以,我们可以写出我们list的迭代器。

2024-07-22 11:41:25 894

原创 vector实现关于迭代器失效

即我们不知道v.begin()这个迭代器会不会失效。如果迭代器失效了,就不能再去使用这个迭代器,如果使用了,结果是未定义的。发生扩容时,旧空间被释放,但是position还是指向原来的旧空间,内部position的改变不影响我们本身的v.begin()我们去接收新的迭代器的返回值去更新这个失效的迭代器。但在一些特殊的情况下会失效,下面这种情况下程序崩溃。我们也可以通过返回迭代器的方式去解决这个问题。如果只是这种问题,那其实很好解决,我们只需要。先写一个insert函数。先写一个erase函数。

2024-07-21 15:24:30 261

原创 string使用

目录1.string的遍历补充:at2.容量相关(1)reserve(2)resize(3)其他(不完整)3.插入数据(1)append与+=(2)insert4.erase与replace5.find系列先总结:一个类他的函数成员,函数方法很多,实现很复杂,需要的时候去查文档,记是记不住的,下面有一个查文档的网站string::data - C++ Reference

2024-05-16 19:13:43 282

原创 #初阶模板

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

2024-05-13 17:23:00 335

原创 C++内存管理

new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间new T[N]的原理1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请2. 在申请的空间上执行N次构造函数delete[]的原理。

2024-05-11 21:16:34 983

原创 #内部类#

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外 部类,更不能通过外部类的对象去访问内部类的成员。,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。1.B类始终是声明在A类里面的,所以虽然B类是独立于A类之外的,但在定义B类的时候,依然要突破A类域。2.B类是A类的内部类,B是可以去访问A类的成员变量的,static变量与普通成员变量都可以。(2)注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。

2024-05-09 19:04:07 204

原创 #友元函数与友元类

在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time 类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加friend关键字。如果一个类A是另一个类B的友元,则A里面的成员函数都可以去访问B里面的私有成员变量。2.友元关系不能传递 如果B是A的友元,C是B的友元,则不能说明C时A的友元。1.友元函数可访问类的私有和保护成员,但不是类的成员函数。

2024-05-09 17:21:44 241

原创 static成员

如图,因为被s。

2024-05-09 16:26:00 456

原创 #匿名对象

平时是先创建一个有名对象,通过有名对象去传参,因为自定义类型在C++中函数参数传递,在函数调用前,调用类里面的函数需要创建一个类,但是只为了调用函数创建一个多余的类也不合适,用匿名对象。但是只是为了传参就生成一个对象有点不合适,所以我们可以用。C++规定自定义类型传值传参必须用拷贝构造函数去完成。传参之后匿名对象也就会被释放。假如我们有一个类,类型名为A。,防止浅拷贝出现问题,

2024-05-08 15:14:14 213

原创 #初始化列表

的地方。2.先走初始化列表(初始化),再走函数体(赋值)。3.不管写不写,每个成员都要走初始化列表。及我们会在初始化列表中去初始所有的成员,对于自定义类型的成员,会去调用它的默认构造函数,对于内置类型不做处理,所以能用初始化列表就用初始化列表。4.初始化列表走的顺序只与。

2024-05-06 15:41:21 559

原创 类的流插入与流提取

为什么内置类型可以直接使用流插入与流提取?其实本质上是人家已经写好了相关的函数,内置类型可以直接调用cout与cin对于自定义类型,我们需要自己写相关的函数。

2024-05-06 13:56:32 308

原创 取地址及const取地址操作符重载

一般不用重新定义 ,编译器默认会生成。

2024-04-28 20:11:01 215

原创 #const成员

这个时候我们去构建一个const Date,如下,这是不和法的,为什么呢?基于写的日期类的实现,去分析const成员的问题。,之前就说了,权限可以缩小,平移,但不能放大。所以在这后面加个const就可以了。需要用到下面的两个函数。

2024-04-28 14:59:10 166

原创 Date类的实现

目录1.Date.h2.Date.c

2024-04-27 15:15:36 157

原创 #运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)注意!1.不能通过连接其他符号来创建新的操作符:比如operator@2.重载操作符必须有一个类类型参数,用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义。下面这个的参数就至少要有一个类类型参数。

2024-04-26 14:44:27 305

原创 #拷贝构造

默认生成的会出问题。

2024-04-26 13:21:18 257

原创 #析构函数

若未显式定义,系统会自动生成默认的析构函数。注意:析构,函数不能重载。,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由 编译器完成的。而对象在销毁时会自动调用析构函数,完成。像自定义类型的析构函数和构造函数还是需要我们自己写,然后编译器会去自动调用。如果我们自定义类型没有写析构函数,就会报错。这里和我们构造函数是一样的。就需要写析构函数,因为空间是malloc来的,在堆上,需要我们手动释放。如果我们不写析构函数,编译器会自己生成一个析构函数。,成员变量出了作用域就自动销毁了。4.自动生成析构函数。

2024-04-26 11:14:53 419

原创 #构造函数

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。构造函数的主要任务是初始化对象。

2024-04-25 17:07:26 673

原创 #this指针#

为什么它的d1.Print()知道去调用d1里面的成员变量,而没有去调用d2里的成员变量呢?我们的Print函数又是放在的公共代端,所以其实这里的Print函数隐藏了一个参数,具体如下。,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递。,即成员函数中,不能给this指针赋值。

2024-04-24 21:30:57 392

原创 类的实例化

用类类型创建对象的过程,称为类的实例化。1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;因为person类是没有空间的,只有person实例化出的对象才有年龄。类就像是现实生活中建造房子的图纸,只是一种设想。并不占用实际的空间。类域里面的成员变量是声明,不是定义。声明是还没有实现的承诺,承诺实现了就是定义。

2024-04-24 20:47:57 176

原创 类的初步认识与应用

类体中的内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。2.类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::一般情况下,多采用第二种定义方式,感觉和普通函数的声明和定义分离很像。C++中类的定义可以用struct与class,但是它们其实是有区别的,和访问限定符有关。

2024-04-24 18:49:43 509

原创 基于范围的for循环

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因 此C++11中引入了基于范围的for循环。注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。对于类而言,应该提供 begin和end的方法,begin和end就是for循环迭代的范围。对于数组而言,就是数组中第一个元素和最后一个元素的范围;注意:以上代码就有问题,因为for的范围不确定。2. 迭代的对象要实现++和==的操作。2.范围for的使用条件。1.范围for的语法。

2024-04-24 17:06:46 259

原创 auto关键字使用细则

在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。auto关键字在编译的时候,系统会自动识别类型,typeid().name是一个输出对象类型的语句。,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。std::map::iterator 是一个类型,但是该类型太长了,特别容易写错。auto和auto*没有任何区别,但用auto声明引用类型时则必须 加&1. auto与指针和引用结合起来使用 用auto声明指针类型时,用。类型声明时的“占位符”

2024-04-24 16:43:55 269

原创 #内联函数#

2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建 议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不 是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。inline函数在release的模式下会在使用了内联函数的地方展开,会用函数体替换函数的调用,这里和宏是类似的,但不是整个函数体一字不差的替换。当内联函数是递归函数,或者函数内容太多,编译器会忽略内联特性。inline关键字是用来定义内联函数的。

2024-04-23 09:52:55 401

原创 #C++里的引用#

注意!!引用类型必须和引用实体是同种类型的。同时,这里还存在符号多用的情况:&在其他其他地方是取地址,在这里就是:类型&引用变量名(对象名)=引用实体int a = 10;//

2024-04-21 18:58:09 260 1

原创 #函数重载#

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。上面两个函数的名字相同,但参数不同,可以实现类似的功能,这就是重载函数。编译器会根据参数的类型,个数,顺序来自动识别应该使用哪一个函数,使用重载函数的哪一个功能。1.要求构成重载,需要函数名相同,参数不同,包括个数不同,顺序不同,类型不同,顺序不同指的是数据的类型顺序不同。4.在不同的域里面不构成函数重载,如下。

2024-04-20 20:38:51 200

原创 #缺省参数#

2.缺省参数不能在函数声明与定义中同时出现,缺省参数在给默认值的时候在函数声明的时候给出,这主要是怕我们声明与定义给的默认参数值不一样。3.缺省值必须是常量或者全局变量,就是说默认的值必须是常量或者全局变量。1.半缺省必须从右到左依次来给出,不能间隔着给。,不能跳过第一个参数不传,直接传第二个参数。全缺省,只有部分的参数有默认的值。即使使用的人不传参数,参数也有一个默认值。对于上面的结果如下,这里需要注意一点,全缺省,即所有的参数都有默认的值。传参的时候必须从左到右显示传参。传了参数以传过去的参数为主。

2024-04-20 20:02:55 211

原创 #命名空间

学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。他去命名空间里面去找,这个时候哪怕全局空间里面有与命名定义域内相同命名的函数Add,但是编译器找到的是命名空间里面的Add。上面这个语句可以将filed这个域全部展开,展开之后,域里面定义的各种,则可以不通过::直接访问。感觉展开之后,命名空间域里面的各种定义和在全局空间中的定义就没有什么使用上的区别了。下面的名字相同的两个域会合并,其实就相当于一个域,所以会产生下面的重定义的错误。可以嵌套,空间域里面套空间域。

2024-04-20 19:34:41 338

原创 *初阶指针*

2.p++,指针加1,指针指向的地址会跳过一个arr(int* p =arr)大小,即4个字节,会指向下一个元素,这里数组里面的值依次打印。char* (指向字符的指针) ) int* (指向整型的指针) 函数指针(指向函数的指针)等。:在不同平台上指针大小不同,在同一平台上,不同类型的指针大小相同。1.p+5指向arr中的6,p+3指向arr中的4。指针未定义,指针越界访问,指针指向的空间释放。,地址在C语言中叫做指针,平时说的指针是。&a得到的是a的地址,本质上是a的。引用的时候的步长大小。

2024-03-08 21:34:57 183 1

原创 整型提升与算数转换

1.隐式c的整型运算总是以缺者整型的类型(默认int型)进行计算的2.操作符的各个操作数属于不同类型时要转换成一个类型。

2024-01-19 21:41:07 475 1

空空如也

空空如也

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

TA关注的人

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