- 博客(70)
- 收藏
- 关注
原创 C++ 笔记11 | 运行时的类型信息
二十三 运行时的类型信息//了解1 typeid操作符#include typeid(类型/对象);//返回typeinfo对象,用于描述类型信息2 dynamic_cast操作符语法:目标变量 = dynamic_cast<目标类型>(源类型变量);适用场景:主要用于具有多态特性父子类指针或引用之间的显式类型转换.二十四 C++异常机制(exception)1 软件开发中的常见错误1)语法错误2)逻辑错误3)功能错误4)设计缺陷5)需求不符6)环境异常7)操作不
2021-05-09 23:47:57
670
1
原创 C++ 笔记10 | 多态(polymorphic)
二十二 多态(polymorphic)1 虚函数覆盖(函数重写)、多态概念1)如果基类中某个成员函数被声明为虚函数,那么子类中和该函数具有相同的成员函数就也是虚函数,并且对基类中版本形成覆盖,即函数重写。2)满足虚函数覆盖关系后,这时通过指向子类对象的基类指针或者通过引用子类对象的基类引用,去调用虚函数,实际被执行的将是子类中的覆盖版本,而不是基类中的原始版本,这种语法现象被称为多态。class Base{public:virtual void func(void){}//虚函数};clas
2021-05-09 23:22:42
353
4
原创 C++ 笔记9 | 继承2
回顾:1 子类对象的创建和销毁过程1)创建:分配内存->构造基类子对象->构造成员子对象->子类构造函数代码2)销毁:子类析构函数代码->析构成员子对象->析构基类子对象->释放内存2 子类的拷贝构造和拷贝赋值3 子类的操作符重载4 多重继承5 钻石继承和虚继承A(int m_data)/ B C\ /DA(int m_data)/ B C //class B/C:virtual public A{};\ /D //负责构造公
2021-05-09 17:04:04
84
原创 C++ 笔记8 | 继承1
二十一 继承(Inheritance)1 继承的概念 //了解通过一种机制描述类型之间共性和特性的方式,利用已有的数据类型定义新的数据类型,这种机制就是继承.eg: 人 类:姓名、年龄、吃饭、睡觉 学生类:姓名、年龄、吃饭、睡觉、学号、学习 教师类:姓名、年龄、吃饭、睡觉、工资、讲课 ... ------------------------------------------ 人 类:姓名、年龄、吃饭、睡觉 学生类 继承 人类:学号、学习 教师类 继承 人类:工资、讲课 ...
2021-05-09 16:24:56
159
原创 Linux网络编程笔记9 | 多线程
十四、多线程1.什么是线程?源代码 -编译和链接-> 程序 -加载到内存中-> 进程| |文件 内存/ 代码 <- 执行数据 <- 处理| | <- CPU静态 动态| |资源 线程线程就是进程的执行过程,即进程内部的控制序列,或者说是进程中的一个任务。一个进程可以
2021-04-24 22:32:37
256
原创 Linux 网络编程笔记8 | 网络通信
十三、网络通信1.网络和网络协议1)什么是计算机网络?计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过有形或无形的通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。2)什么是网络协议?网络协议是一种特殊的软件,是计算机网络实现其功能的最基本的机制。网路协议的本质就是规则,即各种硬件和软件必须遵循的共同守则。网络协议并不是一套单独的软件,它融合于所有涉及网络通信的软件甚至硬件之中,因此可以说协议于网络中无处不在。
2021-04-21 23:22:34
280
2
原创 Linux 网络编程笔记7 | 进程间通信
十二、进程间通信1.什么是进程间通信Unix/Linux系统中每个进程都拥有独立的4G字节大小的虚拟内存空间。其中高地址的1G字节被映射到相同的物理内存区域,用于保存内核代码和数据。低地址的3G字节作为保存用户代码和数据的用户空间,被映射到彼此不同物理内存。因此同一个虚拟内存地址,在不同的进程中,会被映射到不同的物理内存区域,在多个进程之间以交换虚拟内存地址的方式交换数据是不可能的。鉴于进程之间天然的内存壁垒,为了能够在不同进程之间高效地交换数据,需要有一种专门的机制,这就是所谓的进程间通信(Inter
2021-04-19 01:24:56
240
原创 Linux网络编程笔记6 | 信号
十一、信号1.基本概念1)什么是信号?事件(信号)过程(进程)1---------v--------->/ /事件过程(进程)2 /—v---/ / 过程(进程)3 /— ---信号是提供异步事件处理机制的软件中断。这些异步事件可能来自硬件设备,也可能来自系统内核,甚至可能来自用户程序。进程之间可以相互发送信号,这使信号成为一种进程间通信(Inter-Process Communication, IPC)的基本手段。信号的异步特性不仅
2021-04-17 01:11:49
204
原创 LInux 网络编程笔记5 | 进程
十、进程1.进程的基本概念程序:磁盘上的可执行文件。| 加载v进程:内存中的指令和数据。执行 | ^v | 访问CPU—+2.进程的分类交互式进程:由Shell启动,借助标准I/O与用户交互。批处理进程:在无需人工干预的条件下,自动运行一组批量任务。守护(精灵)进程:后台服务,多数时候处于待命状态,一旦有需要可被激活完成特定的任务。3.进程快照ps - 显示当前用户拥有控制终端的进程信息ps axuw - BSD风格选项a: 所有用户x: 既包括
2021-04-12 23:04:19
228
原创 C语言 数据结构笔记1 | 单链表
一、链表的由来数组是最简单的数据结构,链表复杂一些,二叉树、图则更加复杂的数据结构。数据结构由简单到复杂,它们所要解决的问题也是由简单到复杂。要学习复杂的数据结构就要先学习简单的数据结构,如果简单的数据结构可以解决问题,就没必要使用复杂的数据结构。数组天生的缺陷导致的它解决不了某些问题,所以人们发明了链表。数组的三个特点:一:数组中所有的元素类型必须相同;二:数组在定义的时候需要明确指定数组元素的个数,并且一般来说个数是不能改变的(Linux内核中会使用变长数组,在高级语言如C++当中也支持变成数组
2021-04-10 16:45:29
230
原创 LInux 网络编程笔记4 | 文件
九、文件1、文件系统的物理结构1)硬盘的物理结构:驱动臂、盘片、主轴、磁头、控制器2)磁表面存储器的读写原理硬盘片的表面覆盖着薄薄的磁性涂层,涂层中含有无数微小的磁性颗粒,谓之磁畴。相邻的若干磁畴组成一个磁性存储元,以其剩磁的极性表示二进制数字0和1。为磁头的写线圈中施加脉冲电流,可把一位二进制数组转换为磁性存储元的剩磁极性。利用磁电变换,通过磁头的读线圈,可将磁性存储元的剩磁极性转换为相应的电信号,表示二进制数。3)磁道和扇区磁盘旋转,磁头固定,每个磁头都会在盘片表面画出一个圆形轨迹。改变磁头
2021-04-10 15:27:39
228
原创 C++ 笔记7 |操作符重载
二十 操作符重载(operator)1 双目操作符重载 L#R1.1 计算类双目操作符: + - …1)表达式结果是右值,不能对表达式结果再赋值2)左右操作数既可以是左值也可以是右值3)两种具体实现方式–》成员函数形式(左调右参)L#R的表达式可以被编译器处理为"L.operator#®"成员函数调用形式,该函数的返回就是表达式结果。–》全局函数形式(左右都参)L#R的表达式可以被编译器处理为"operator#(L,R)"全局函数调用形式,该函数的返回就是表达式结果。注:通过frien
2021-04-10 14:59:34
220
原创 C++ 笔记6 | 静态成员 成员指针
十八 静态成员(static)1 静态成员变量1)语法class 类名{static 数据类型 变量名;//声明};数据类型 类名::变量名 = 初值;//定义和初始化2)普通成员变量属于对象,而静态成员变量不属于对象,静态变量内存在全局区,可以把静态变量理解为被限制在类中使用的全局变量.3)普通成员变量在对象构造时定义和初始化,而静态成员变量在类的外部单独定义和初始化。4)使用方法类名::静态成员变量;//推荐对象.静态成员变量;//和上面等价2 静态成员函数1)语法class
2021-04-10 14:55:59
868
原创 C++ 笔记5 | this指针 析构函数 拷贝构造和拷贝赋值
十五 this指针和常成员函数1 this指针1)类中的成员函数(包括构造函数、析构函数)都有一个隐藏的当前类类类型的指针参数,名为this。在成员函数中访问类中其它成员,其本质都是通过this来实现的。2)对于普通的成员函数,this指针就是指向该成员函数的调用对象;对于构造函数,this指针就指向正在创建的对象。3)大多数情况,可以忽略this直接访问类中的成员,但是在以下几个特殊场景必须要显式使用this指针:–》区分作用域–》从成员函数返回调用对象自身(返回自引用)//重点掌握–》从类
2021-04-10 14:53:16
269
原创 C++ 笔记4 | 构造函数和初始化列表
十四 、构造函数和初始化列表1 构造函数可以重载,也可以带有缺省参数//匹配string的无参构造函数string s;//匹配string的有参(const char*)构造函数 string s("hello");---------------------------------http://www.cplusplus.com/2 缺省构造函数(无参构造函数)1)如果类中没有定义任何构造函数,编译器会为该类提供一个缺省(无参)构造函数:–》对于基本类型成员变量不做初始化
2021-04-10 14:49:21
207
原创 栈空间为什么会满?
一、第一种解释栈空间是预设的,它通常用于存放临时变量,如果你在函数内部定义一个局部变量,空间超出了设置的栈空间大小,就会溢出。不仅如此,如果函数嵌套太多,也会发生栈溢出,因为函数没有结束前,函数占用的变量也不被释放,占用了栈空间。二、第二种解释对每个程序来说,栈能使用的内存是有限的,一般是 1M~8M,这在编译时就已经决定了,程序运行期间不能再改变。如果程序使用的栈内存超出最大值,就会发生栈溢出(Stack Overflow)错误,程序就崩溃了。这个就像木桶里的水,木桶的容量有限,水满了自然会溢出
2021-04-08 23:30:36
2078
原创 C++ 笔记3 | 显示类型转换 类 对象 类的定义和实例化
十 C++引用(Reference)1 定义1)引用即别名,引用就是某个变量别名,对引用操作和对变量本身完全相同.2)语法类型 & 引用名 = 变量名;注:引用必须在定义同时初始化,而且在初始化以后所绑定的目标变量不能再做修改.注:引用类型和绑定目标变量类型要一致。2 常引用1)定义引用时可以加const修饰,即为常引用,不能通过常引用修改目标变量.const 类型 & 引用名 = 变量名;类型 const & 引用名 = 变量名;//和上面等价2)普通引用也可
2021-04-08 22:55:47
254
原创 Linux 网络编程笔记3 | 内存 系统调用
八、系统调用应用程序--------------+vi/emacs/gftp/firefox || |标准库、第三方库 |C/C++/Qt/X11 || |系统调用<------------+brk/sbrk/mmap/munmap1.Linux系统内核提供了一套用于实现各种系统功能的子程序,谓之系统调
2021-04-07 19:27:47
294
1
原创 C++ 笔记2 | 重载与缺省参数 内联 动态内存分配 引用
八、 C++的函数1、函数重载(overload)1)定义在相同作用域,可以定义同名的函数,但是参数必须有所区分,这样函数构成重载关系.注:函数重载和返回类型无关。eg:实现图形库中一些绘图函数//C语言 void drawRect(int x,int y,int w,int h){} void drawCircle(int x,int y,int r){} ... -----------------//C++语言 void draw(int x,int y,int w,int h)
2021-04-04 21:21:50
158
原创 C++ 笔记1 | 第一个C++程序 结构体 联合 枚举 string、bool类型
一、第一个C++程序#include<iostream>int main(void){ std::cout << "hello word!" <<endl; return 0;}1、编译方式1)gcc xx.cpp -lstdc++2)g++ xx.cpp //推荐2、文件扩展名1).cpp //推荐2).cc3).C4).cxx3、头文件#include –》C++中和I/O相关的类型、对象、函数都在在头文件中–》C++中大多数头
2021-04-04 20:10:46
547
原创 Linux 网络编程笔记2 | 库 环境变量
一、库a.c -> a.outfoo()bar()hum()main()单一模型:将程序中所有功能全部实现于一个单一的源文件内部。缺点:编译时间长,不易于维护和升级,不易于协作开发。分离模型:将程序中的不同功能模块划分到不同的源文件中。优点:缩短编译时间,易于维护和升级,易于协作开发。a.c -> a.o foo() | -> …bar() |b.c -> b.o /hum()a.o b.o | -
2021-03-30 00:25:46
304
1
原创 Linux 网络编程笔记1 | GCC 预处理 预定义宏 环境变量
一、GCC编译选项gcc [选项] [参数] 文件1 文件2 …-o: 指定输出文件如:gcc hello.c -o hello-E: 预编译,缺省输出到屏幕,用-o指定输出文件如:gcc -E hello.c -o hello.i-S: 编译,将高级语言文件编译成汇编语言文件如:gcc -S hello.c-c: 汇编,将汇编语言文件汇编成机器语言文件如:gcc -c hello.s-Wall:产生全部警告如:gcc -Wall wall.c-Werror:
2021-03-28 22:25:14
577
2
原创 RT_Thread 启动流程
一般了解一份代码大多数从启动部分开始,同样这里也是采用这种方式,先寻找启动的源头。以MDK_ARM为例。MDK_ARM的用户程序入口为main()函数,位于main.c文件中。系统启动后先从汇编代码startup_stm32f103xe.s开始运行,然后跳转到C代码,进行RT_Thread系统功能初始化,最后进入用户程序入口main().为了在进入main()之前完成RT_Thread系统功能初始化,我们使用了MDK扩展功能subsubsub和和和superKaTeX parse error: Can't
2021-03-27 14:10:18
504
转载 C语言 结构体 联合体 | 嵌套使用
结构体、联合体是C语言中的构造类型,结构体我们平时应该都用得很多。但是,对于联合体,一些初学的朋友可能用得并不多,甚至感到陌生。我们先简单看一下联合体:在C语言中定义联合体的关键字是union。定义一个联合类型的一般形式为:union 联合名{成员表};成员表中含有若干成员,成员的一般形式为:类型说明符 成员名。其占用的字节数与成员中最大数据类型占用的字节数。下面我们一起看一下结构体、联合体结合使用在C语言、嵌入式中的一些实用技巧。1、应用于管理不同的数据示例代码:enum DATA_
2021-03-22 21:38:24
12612
4
原创 C语言 结构体 | 由浅到深介绍
一、结构体的概述C语言中有两种类型:原生类型和自定义类型。结构体类型是一种自定义类型1、结构体使用定义结构体是需要先声明结构体的类型,然后再用结构体类型来定义结构体变量,不过也可以在定义的同时定义结构体变量。如:# include<stdio.h>//定义类型struct people{ char name[20]; int age;};//定义类型的同时定义变量struct student { char name[20]; int age;}s1;//将类型s
2021-03-22 00:07:16
357
7
原创 C语言 关键字 | typedef
1、typedef关键字的用法typedef是C语言中的一个关健字,用于定义新的类型(或者类型的重命名)C语言中的类型一共有两种:一种是编译器定义的原生类型(基础数据类型,如 int、double之类的);第二种是用户自定义类型,不是语言自带的,而是程序员自己定义的(如数组类型、结构体类型、函数类型等)。我们今天讲的数组指针、指针数组、函数指针等都属于用户自定义类型。有时候自定义类型太长了,用起来不方便,所以用typedef给它重命名一个简短的名字。只是类型的命名工。 所以typedef本身并不
2021-03-21 16:09:46
1188
原创 C语言 实战练习 | 贪吃蛇
#include <stdio.h>#include <stdlib.h>//#include <stdbool.h>#include <Windows.h>#include <time.h>#include <conio.h> /*键盘输入获取*/bool gameOver;bool stop = false;bool hit = false;/*游戏的边框大小*/const int width = 50;co
2021-03-18 18:31:55
203
1
原创 C语言 | strncpy() strcpy()的实现
1、strcpy()char * rt_strcpy(char *dst ,const char *src){ if(src != NULL) { char *d = dst; const char *s = src; while(*s++ != 0) { *d++ = *s; } } return (dst);}2、strncpy()char * rt_strncpy(char *dst ,const char *src ,int n){ i
2021-03-18 16:20:57
244
原创 C语言 | 深入学习数组
说明:本文章之讨论一维数组,适宜程度:对C语言初步认识及想深入学习者1、从编译器角度理解数组从编译器角度理解来讲,数组也是一个变量,和普通的变量没有本质的区别。变量的本质指的是一段内存空间,编译器在编译的时候,会将一个变量名和这段内存空间的第一个字节地址绑定,变量的类型决定了这段内存空间的字节数。当我们希望访问的这段内存空间的时候,一个方法就是利用变量名访问,但是变量名会受到作用域的限制,还有另外一种发法就是直接使用地址访问,并且不会受到作用域的限制。数组的定义一样遵循这样的原理。2、从内存角度理解数
2021-03-15 22:23:25
848
原创 STM32 | C语言对寄存器的封装
说明:这里以GPIO外设为例,介绍C语言对寄存器的封装。以此类推其他外设同样可以用这种方法来封装。本文有两部分构成:1、介绍宏定义。2、使用结构体封装寄存器列表。1、宏定义以封装STM32 GPIOH为例:STM32总线基地址:STM32GPIO基地址:STM32 GPIOH端口寄存器列表:所以我们先定义总线基地址,但是总线基地址是相对外设基地址的偏移,外设基地址又是总线APB1的地址,故可以先定义外设基地址:#define PERIPH_BASE ((unsi
2021-03-07 18:31:23
1545
2
原创 STM32 | 存储器和寄存器
说明:如下举例,都以STM32芯片为主。1、什么是存储器映射?存储器本身不具有地址的信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就叫存储器映射。如果再分配一个地址就叫做重映射。如下图所示STM32 F407ZGT6中存储器映射图。2、什么是寄存器给有特定功能的内存单元取一个别名,这个别名就是我们经常说的寄存器。这个给已经分配好的有特定功能的内存单元取别名的```过程````就叫寄存器映射。举例说明寄存器映射通过寄存器别名方式访问内存单元://GPIOH 端口全部输出 高电
2021-03-07 18:24:43
420
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人