- 博客(54)
- 收藏
- 关注
原创 C++进阶:2_多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写**在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。**派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。
2024-08-31 15:57:32
952
原创 C++进阶:1_C++中的继承
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。继承和组合(组合和继承都是一种复用)这里讨论共有继承public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。
2024-08-07 15:57:37
725
原创 C++初阶:10_模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-08-07 15:54:58
543
原创 C++初阶:9.stack和queue
queue的文档介绍队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数ront:返回队头元素的引用ack:返回队尾元素的引用。
2024-07-08 14:21:54
723
原创 list的模拟实现
要模拟实现list,必须要熟悉list的底层结构以及其接口的含义,通过上面的学习,这些内容已基本掌握,现在我们来模拟实现list。
2024-05-13 12:21:19
266
原创 C++初阶:8.list
list的文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2024-05-13 12:20:14
1056
原创 C++初阶:7.vector
vector的文档介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。
2024-04-11 22:09:12
1277
原创 C++初阶:6.string类
string类的文档介绍字符串是表示字符序列的类标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_strin
2024-04-10 06:00:00
975
原创 C++初阶:5.STL简介(了解)
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
2024-04-02 06:30:00
355
原创 C++初阶:4.模板初阶
类模版板不能声明和定义分离到两个文件(不是不能,是方式非常挫,后面模板进阶会详谈)class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表。
2024-04-01 18:30:22
762
原创 C++初阶:3.C/C++内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;
2024-04-01 06:30:00
1573
原创 C++初阶:2_类与对象(中)
int _month;int _day;d1.Print();Date d2;d2.Print();return 0;对于Date类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?构造函数是一个。
2024-03-22 22:14:52
921
原创 C++初阶:2_类与对象(上)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。(成员变量和成员函数在类中定义或声明时谁在上谁在下(先定义或声明谁)没有要求。成员函数如果在类中定义,编译器可能会将其当成内联函数处理。类声明放在.h文件中,成员函数定义放在.cpp文件中,一般情况下,更期望采用第二种方式。
2024-03-15 08:56:50
914
原创 C++初阶:1_C++入门
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然**后接一对{}**即可,{}中即为命名空间的成员。// bit是命名空间的名字,一般开发中是用项目名字做命名空间名。// 我们上课用的是bit,大家下去以后自己练习用自己名字缩写即可,如张三:zs// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型int val;//2. 命名空间可以嵌套int a;int b;int c;int d;
2024-03-13 16:55:30
1041
原创 Linux:1_常见指令以及权限理解(上)
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾。Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。: man [选项] 命令。
2024-03-13 16:47:37
969
原创 C++初阶:0_前言
PC平台几乎所有的游戏都是C++写的,比如:魔兽世界、传奇、CS、跑跑卡丁车等,市面上相当多的游戏引擎都是基于C++开发的,比如:Cocos2d、虚幻4、DirectX等。除了上述领域外,在:科学计算、浏览器、流媒体开发、网络软件等都是C++比较适合的场景,为一名老牌语言的常青树,C++一直霸占编程语言前5名,肯定有其存在的价值。比如:智能手环、摄像头、扫地机器人、智能音响等。随着5G的普及,物联网(即万物互联,)也成为了一种新兴势力,比如:阿里lot、腾讯lot、京东、百度、美团等都有硬件相关的事业部。
2024-02-29 04:31:35
919
原创 数据结构:5_排序
1.归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。2.时间复杂度:O(N*logN)3.空间复杂度:O(N)4.稳定性:稳定计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。时间复杂度:O(MAX(N,范围))空间复杂度:O(范围)稳定性:稳定。
2024-02-29 04:30:39
954
原创 数据结构:4_二叉树
TreeNode;// 1.前序访问// 2.中序访问// 3.后序访问// 4.层序遍历// 5.二叉树销毁// 6.是否是完全二叉树// 1.节点个数// 2.叶子节点的个数//补充:树的高度// 3.第k层结点个数// 4.查找值为x的结点// 通过前序遍历的数组构建二叉树// 手撕二叉树// 1.前序访问return;//根据BTDataType选择打印格式// 2.中序访问return;
2024-02-17 08:12:24
1097
原创 Linux:0_Linux 环境搭建
XShell 是一个远程终端软件. 下载官网下载安装的时候选择 “home/school” 则为免费版本.
2024-01-24 13:27:53
372
1
原创 数据结构:3_栈和队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。出队列:进行删除操作的一端称为。栈的实现一般可以使用。
2024-01-24 13:08:51
524
原创 数据结构:2_顺序表和链表
线性表是一种在实际中广泛使用的数据结构,,线性表在物理上存储时,通常以数组和链式结构的形式存储。逻辑上是依次储存的但物理上不一定是。
2024-01-17 12:45:25
631
1
原创 数据结构:1_算法的时间复杂度和空间复杂度
算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。
2024-01-17 12:41:24
982
原创 13_程序环境和预处理
_FILE__ //进行编译的源文件名称__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义__FUNCTION__ //当前函数的名称这些预定义符号都是语言内置的。语法:1000register//为 register这个关键字,创建一个简短的名字for;;//用更形象的符号来替换一种实现break;case。
2023-11-30 13:54:48
815
原创 11_动态内存管理
/size的单位是字节这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针如果开辟成功,则返回一个指向开辟好空间的指针如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查(申请空间过大可能失败)返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定如果参数size为0,malloc的行为是标准未定义的,取决编译器。
2023-11-28 13:42:42
949
1
原创 10_自定义类型结构体,枚举,联合
int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化//也可以乱序初始化struct Stu s = {.age=18, .name="如花"};int data;//结构体嵌套初始化//结构体嵌套初始化。
2023-11-11 12:59:40
131
1
原创 9_字符函数和字符串函数
字符串以’\0’作为结束标准.strlen函数的返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’)参数指向的字符串必须要以 ‘\0’ 结束。注意函数的返回值为size_t,是无符号的( 易错 )学会strlen函数的模拟实现//法一:计数器count++;str++;//法二:函数递归if (*str!//法三:指针减指针。
2023-10-24 01:00:00
25
原创 8_指针的进阶
指针的进阶一. 字符指针1. 形式字符指针 char*2. 使用方式一般使用int main(){ char ch = 'w'; char *pc = &ch; *pc = 'w'; return 0;}另一种使用方式int main(){ const char* pstr = "hello bit.";//这里是把一个表达式首字母的地址放到pstr指针变量里了 printf("%s\n", pstr); return 0;}3. 一道面试题
2023-10-20 16:39:12
176
原创 7_深度剖析数据在内存中的存储
int *pi;char *pc;float* pf;void* pv;//无具体类型指针大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中;
2023-09-27 10:53:57
164
1
原创 5_指针详解
type + *其实:char* 类型的指针是为了存放 char 类型变量的地址。short* 类型的指针是为了存放 short 类型变量的地址。int* 类型的指针是为了存放 int 类型变量的地址。
2023-09-13 08:08:46
120
1
原创 4_操作符详解
逻辑反操作- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反(即全部取反:符号位+数值位)-- 前置、后置--++ 前置、后置++* 间接访问操作符(解引用操作符)(类型) 强制类型转换逻辑取反取地址操作数类型长度~ 对一个数的二进制按位取反++和–口诀:前置++,先+1后使用后置++,想使用后+1。
2023-09-10 19:00:47
130
1
原创 3_数组详解+三子棋和扫雷练习
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码时,最好自己做越界的检查。数组在创建的时候如果想不指定数组的确定的大小就得初始化。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。随着数组下标的增长,元素的地址,也在有规律的递增。数组的下标是有范围限制的。
2023-09-06 12:04:32
103
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人