剑指Offer-一刷
DataStruct and Algorithm1 赋值运算符函数
为类型CMyString的声明添加赋值运算符函数
Testing case
一个CMyString实例赋予另外一个实例
一个CMyString实例赋值给它自己
连续赋值
Key
考虑测试用例,是否传入参数是对象本身
若传入参数为自身,则释放原有内存后将无法继续赋值,因为参数内存也被释放
考虑函数返回值是否为引用,并相应的返回引用
引用作函数返回值使=运算符可连=
函数参数是否为常引用
传入参数类型为引用将避免无谓的消耗,常引用则不希望影响原对象
传值时会调用拷贝构造,降低效率
为已存在指针创建新的内存前是否释放原内存并置空
若为释放原内存则会造成内存泄漏
若释放后未置空,则导致野指针出现
Answer经典解法
12345678910111213141516171819202122232425262728293031class CMyString {public: CMyString(char* pData = nullptr); CMyString(const CMyString ...
Design mode / 设计模式
Design mode / 设计模式
没有任何稳定点的软件体系结构,设计模式没有意义
任何点都稳定的软件体系结构,设计模式也没有意义
从变化点和稳定点中寻找隔离点,分离后管理变化
编译时稳定复用
运行时多态变化
设计原则
应对变化 提高复用
二进制单位意义的复用,而不是代码片段级粘贴性质的复用
二进制单位意义的复用无需重新编译部署
依赖倒置原则 -DIP
变化应该依赖于稳定,稳定不应该依赖于变化
高层模块不应该依赖于低层模块,二者都可以依赖于抽象
抽象不应该依赖于实现,实现细节可以依赖于抽象
开闭原则 -OCP
对拓展开放,对修改封闭
类模块应该是可拓展的,但是不可修改
类应该以拓展方式来应对需求变化,而不是更改类中代码
单一职责原则 -SRP
一个类应该仅有一个引起它变化的原因
桥模式
接口隔离原则 -ISP
不能让用户依赖于他们不使用的方法
就是一个类实现了多个接口,其中用户用不到的方法使用private等限定隔离
里氏替换原则 -LSP
子类型必须能替换掉它的父类型 IS-A
能使用父类对象的方法子类也能适用
假设有两个类,一个是Base类,另一个是Child类, ...
C++ SBH堆管理机制
Heap堆管理机制 - SBHCRT Strartup codeImportance
正确初始化C run-time library,即CRT
确保C++中静态对象的构造函数在正确的时机被调用
Entry-Point Symbol
使用一个 function name 作Entry-Point Symbol,指定startup code
The funtion must be defined with the __stdcall calling convention(公约)
mainCRTStartup
控制台应用程序 Console
WinMainCRTStartup
窗体应用程序 Windows
_DllMainCRTStartup
动态链接库 Dll
Example - mainCRTStartup()Code Abstract
12345678910111213141516171819void mainCRTStartup(void) {//...int mainret;if(!_heap_init(0)) // 1. heap初始化__t ...
C++ Thread
Process 进程进程概述
程序
可执行的二进制文件,占用磁盘资源
进程
运行中的程序,占用CPU资源,不占据磁盘资源
是系统资源分配的基本单位
进程空间defination
每一个进程都会对应一个进程空间,即虚拟地址空间
其大小与操作系统的位数有关
n位操作系统,虚拟地址空间大小为2^n
虚拟地址空间
作用
操作系统cpu不具备数据存储能力,仅具备运算能力
cpu通过mmu内存管理单元
实现虚拟地址到物理内存的映射
意义
扩大地址空间
保护内存,不同进程运行在不同的虚拟地址空间中,互不影响
控制内存访问,提高了安全性
解决了直接使用物理内存导致的大量内存碎片问题
Address Layout -32bit内核区 1G标记: 目前了解并不深入
公用内核代码和数据
不允许用户态应用程序直接或间接读写该区域
内核区驻留内存,是操作系统的一部分
虽然每个进程都有自己独立的虚拟地址空间,但是这些虚拟地址空间的内核区,关联着同一块物理内存
维护进程相关的数据结构
pcb进程控制块
pcb进程控制块中记录了进程运行相关的一些信息,如进程id,进程状 ...
Socket
Socket 初识Necessary foundationIP地址
在全球互联网范围内唯一标识主机的地址
IPV4
32bit,4byte的地址,使用点分十进制法表示
可以使用的IP地址为2^32个
IPV6
128bit,16byte的地址,使用:分16进制法表示
可以使用的地址为2^128个
Port 端口
唯一标识主机中的某进程
16bit的 unsigned short (无符号短整型)数
可以使用的端口数目为2^16,有效端口范围为0~65535(2^16-1)
存储模式
大于一字节的数据在内存中的存储方式
大端存储
低内存地址 -> 高内存地址 存放 高字节数据 -> 低字节数据
小端存储
低内存地址 -> 高内存地址 存放 低字节数据 -> 高字节数据
如何判断主机的存储模式基本思路
将一4byte无符号整形数据截取首字节的内容判断该首字节存放是高字节数据还是低字节数据
注意:整数数据从左往右依次为 高字节 -> 低字节
1234567891011121314151617181920#include<iostream ...
TCP 粘包
TCP 粘包
由于TCP本身是一种基于流的,安全可靠的传输协议,所以发送方与接受方每次处理数据的量以及数据的处理频率可以不同
这就导致接收方可能无法完整解析一个数据包,存在数据包粘连问题
Problems
理想状态下接受到了发送方发送的完整数据包
接受到了发送方发来的N个不等长数据包,导致接收方无法拆分
接受到了发送发来的一个N个完整数据包+一个不完整数据包,无法拆分
Reason
发送方与接收方对数据的发送与接受速率,每次处理的量不对等
接收方不知道每个数据包的起始位置与数据包的大小,无法对当前接收到的数据进行拆分
Solutions
使用标准的应用层协议(http,https)封装不定长的数据包
将传输的数据包添加包头(包头大小自定,一般为4byte),包头存有数据包的总字节数(不包括包头大小),形成一个完整的数据块
CodeProblem
发送方逐行读取txt文件中的内容进行发送,接收方由于不知道完整数据包大小导致无法设置接收缓存的大小来接收并处理完整数据包
123456789101112发送方:WelcometoChina!理想接收方:WelcometoChina!实际 ...
C++ 2.0新特性
C++2.0 新特性语言
Variadic Templates
move Semantics
auto
Range-base for loop
Initiallizer list
Lambdas
…
标准库
type_traits
Unordered容器
forward_list
array
tuple
Con-currency
RegEx
…
C++ Standard演化
c++ 98 (1.0)
c++ 03 (TR1,Technical Report 1)
c++ 11 (2.0)
c++ 14
—-Part for Language—-
Spaces in Template Expressions
12vector<list<int> > // OK in each C++ Versionvector<list<int>> // OK since C++11 可以省略空格,编译器不会误以为为>>运算符
nullptr and std::nullptr_tnullptr关键字
nullptr可以自动转换为每 ...
C++ STL
STL体系结构六大组件容器 container
分配器 allocator
适配器 adaptor
算法 algorithm
迭代器 itrator
泛化指针
[)前闭后开区间
o.begin()指向首元素,o.end()指向尾元素的下一个位置
仿函数 functor
OOP and GPObject-Oriented Programming 面向对象编程
datas 和 methods 封装在一个类中
Generic Programming 泛型编程
datas 和 methods 分开
algorithms 通过 Iterators 操作 containers 中的数据 并可使用functors
容器容器分类Sequence Containers 序列容器
Arrays 数组
Vector 动态数组
deque 双向队列
List 双向链表
Forward-List 单链表
Associative Containers 关联容器
set 无重复元素的集合
multiset 可有重复元素
map 无重复元素的键值对集合
multimap 可有重复元素
底层结构为红 ...
Algorithm and DataStruture -Primary
Algorithm and DataStruture
线性表Vector and ArrayList静态链表以定长数组来实现单链表
静态链表每个结点存放的”指针域”为游标即数组下标,以数组下标来指明下一结点地址
组成备用链表与数据链表的组合构成一个静态链表
备用链表:
头结点:a[0]
其余链表结点:均只存放指向下一可利用空间的游标
尾元结点置为0
数据链表:
头结点:仅研究无头结点的 a[1]为第一个结点且存放数据
其余链表结点:均只存放指向下一数据结点的游标
尾元结点置为1
尾元结点非数组的最后一个元素,而是最后一个有实际值的结点,游标值为-1
结点结构
123456typedef struct StaticLinkList { int data; int next;}StaticList[MAXSIZE];// 使用StaticList定义等价为 struct StaticLinkList xx[MAXSIZE];
用途对于不支持指针的高级程序设计语言和数据元素长度固定不变
静态链表的优缺点:优点:再插入和删除时候,只需要修改 ...
C++ 面向对象进阶
C++ 面向对象兼对象模型conversion function 转换函数1234Type one;double two;Type Three = one + two; //先检测对+运算符的重载,然后检测能否类型转换,注意二义性double four = one + two; //先检测对+运算符的重载,然后检测能否类型转换,注意二义性
类类型转换为其他类型
1operator conType() const { return value-conversion}
只要认为合适,一个类中可以有多个转换函数sad
执行运算时,编译器会首先查找是否有运算符重载函数,没有之后再去调用转换函数
有返回值但是不需要显式写出返回值类型
其他类型转换为类类型
no-explict-one-argument
设置只需一个实参的带默认参数的构造函数
二义性
导致原因
存在对类类型对运算符的重载
存在类类型对其他类型的转换函数
存在其他类型转换为类类型的one-argument构造函数
解决
explict-one-argument
将构造函数前加ex ...