/images/joke_bear.jpg

子非鱼的技术博客

C++基础(四)inline函数

第五章 函数

inline 函数

将函数声明为inline可以避免函数调用的开销,空间换时间

调用函数步骤:

  1. 返回地址压栈
  2. 函数参数压栈
  3. 计算返回值
  4. 函数部分所有元素出栈,返回值

C++基础(五)static关键字

static关键字

static全局变量

只能在当前文件访问,其他文件不能通过extern访问

static局部变量

定义时创建,程序结束时销毁,修改了生命周期,作用域不变

static类

static对象的构造在main函数前执行,析构在main函数结束后

static成员变量

存在于所有对象且保持一致,可在其他文件访问

计算机网络(四)应用层(网络编程)

第二章 应用层(网络编程)

UDP编程

udpprocess

UdpClient

from socket import *
serverName = "hostname"
severPort = 12000
clientSocket = socket(AF_INET,SOCK_DGRAM) # ipv4,udp
message = "Hello World"
clientSocket.sendto(message.encode(),(serverName,severPort))
modifiedMessage,serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode)
clientSocket.close()

Udpserver

计算机网络(三)应用层

Chapter 2: 应用层

应用层协议原理

传输层向应用层提供的服务为socket API

socket

简化本主机应用层向传输层发送的非有效信息,通过socket代表一组信息

TCP socket包含源IP,源端口,目标IP,目标端口,连接状态

UDP socket包含源IP,源端口

计算机网络(二)英特网

Chapter 1: Internet

基础概念

网络:由节点和边组成的结构

计算机网络:由主机节点(主机)和数据交换结点(数据的转发,如路由器交换机)构成的网络,边称为数据链路。

还可分为网络边缘(主机),网络核心(数据交换),接入(连接网络边缘和网络核心)

P2P(peer):分布式处理,客户端也可以是服务端

C++面向对象(三)模版

第五章 模版

模版函数(template function)为声明不是定义,在使用时根据输入类型定义

使用模版时,不会使用隐式类型转换

类模版里的每个函数都是函数模版,需要在声明前加上template

C++基础(二)基本数据类型

第二章 C++基础——基本数据类型

基本内置类型

算术类型

类型含义最小尺寸
bool布尔未定义
char字符8位
short短整型16位
int整型16位
long长整型32位
long long长整型64位
float单精度浮点数6位有效数字
double双精度浮点数10位有效数字
long double扩展精度浮点数10位有效数字

类型转换

  1. 当一个算术表达式中既有无符号数又有int值时,int会被转换为无符号数
  2. 当从无符号数中减去一个值时,不管这个值是不是无符号数,都必须保证结果不为负(否则为取模后值)

变量

变量声明于定义的关系

变量声明(declaration)定义了变量的类型和名字,定义(definition)在声明外还申请存储空间

如果只想声明,可在变量名前添加关键字extern

C++基础(六)字符串、向量和数组

第三章 字符串、向量和数组

标准库类型String

读写string对象

string s;
cin >> s;   //from empty to empty
getline(cin,s); //one line, stop by ENTER

当把string对象和字符(串)字面值混在一条语句时,必须确保加法运算符(+)两侧的运算对象至少一个是string

标准库类型vector

vector是模板而非类型

C++基础(三)指针

第二章 C++基础——指针

指针是一个变量,其存储的是值的地址,而不是值本身

使用常规变量时,值是指定的量,而地址是派生量,而指针相反

OOP强调的是在运行阶段(而不是编译阶段)进行决策,提供了灵活性,对于内存管理也更加高效

初始化指针

int* ptr_a;
double* ptr_b;

初始化时必须指定所指元素类型,因为对所有指针来说其都是代表一个初始地址,但从该初始地址读多少字节则由指针类型判断

指针也是作为变量存储,只不过其内存空间存的是地址。指针p1,p2有各自的地址&p1,&p2。长度为4B(32位)或8B(64位)。p1,p2表示存储的所指向元素的地址。*p1表示指向元素的值。 image.png

指针注意事项

在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存(指向不确定)。另外,一定要在对指针提取(*)之前,将指针初始化为一个确定的、适当的地址。

C++基础(四)const限定符

第二章 C++基础——const限定符

const限定符

const对象一经创建后其值不能再改变,所以const对象必须初始化

const int i = 1;

默认情况下,const对象仅在文件内有效。若需在不同文件使用同一const对象,则const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就可以了

extern const int bufSize;

const的引用

用于声明引用的const都是底层const,引用本身已默认为顶层const(无法改变指向)

const型变量只能由const型引用(底层const)

C++基础(一)CPP编译过程、宏以及头文件

第一章 开始

  1. endl将与设备关联的缓冲区(buffer)中的内容刷到设备中。在调试时应保证"一直"刷新流。否则若程序崩溃,输出可能还是缓冲区,导致对于程序崩溃位置的错误推断

  2. 读取数量不定的输入数据可用while (std::in >> value)

    当遇到文件结束符(end-of-file),或遇到一个无效输入时,istream对象状态变为无效,使条件为假

    EOF:在Windows中为Ctrl+Z,UNIX为Ctrl+D

C++编译过程

  1. 预处理(Preprocessing)

“开卷”何必“有益”

有些话小时候听不明白,长大后却会反复想起。

“以后少读读”就是这样一句话。

记得小学阅读课上,我在读一本悬疑小说并写到了读后感作业中,结果第二天就被老师批评,并以“开卷有益”这个成语来教导我说,你这种书以后少读读。

当时,我就觉得老师这种说法一定是错的,但限于那时的表达能力和逻辑能力并不能给出完整的反驳,现写下此文以表述自己的想法。

一个普通人的学习感悟

困惑的起点:学霸的经验为什么没用?

在上学的时候,老师总会在班会课上让学霸分享经验,但真正按照他们的方法学下来也没什么用,而且他们说的还有很多矛盾,比方说:

  • 要不要预习?
  • 学英语要不要去看美剧?

根本就不知道该听谁的。 大学毕业后工作了几年,也遇到了很多优秀的人。原本以为在沟通中很难跟上大佬的思路。但接触下来发现他们平时也嘻嘻哈哈的,和普通人没什么两样。但是他们看上去不用费太多精力就能把事情做好。 我就在想,该怎么变得和他们一样优秀?怎么样去提高自己的学习能力? 每天去上班的路上我都在想这个事情,奇怪的是我好像从来没有思考过这个问题。在上学的时候,我关心的往往是题目,只想着怎么去把题目做对,但从来没有去反思过学习过程有没有问题。在应试教育下,我好像失去了一些思考的能力,每天按部就班得完成老师布置的作业,没有去关注过学习这件事本身。 就这样,我来来回回思考了一星期,得到的都是些模糊的印象,比如说要定期复习,上课认真听讲。然而这都是些感性认识,并不能成体系得去表达学习过程。这时,我接触到了两本书,《学习的逻辑》《认知觉醒》,看完后让我对它有了不一样的认识。

核心洞察:从模糊感到系统性方法

先聊聊视频开头提到的学习经验问题,为什么学霸的学习经验往往都没有用

这可能是因为他们自己都不清楚自己做对了哪些事,可能课前预习或者看剧学英语也有用,但那并不是学习的本质。就好像在说一个成绩优秀的人每天都会吃一个苹果,并不是说吃苹果就会提高成绩,而是人家本来就优秀,和吃什么水果没有关系。

在读完两本书后,我能想到的改进方法是要执行可量化的学习流程,通过指标来评估学习情况,比方说数学的几何模块每个部分的准确率是多少,有没有达到目标,而不仅仅是掌握得一般这种模糊表达。因为只有定量得了解自己的学习情况,才能对薄弱点进行优化。

我的学习流程三阶段

我会把学习流程分为三个阶段:准备阶段,学习阶段和复盘阶段

1. 准备阶段:制定目标,拆解任务

这个阶段的核心是明确方向并规划路径

  • 总目标:比方说考试总分要考多少。
  • 核心目标:之后再细分到每门科目考多少分。
  • 不同阶段的任务
    • 基础阶段:任务主要是整体过一下知识点,不需要花太多时间去死磕压轴题。
    • 强化阶段:要注重不同章节间的联系,挑选些合适的练习题训练。
    • 冲刺阶段:则需要以真题为主了。