错题本 补充本

这里写目录标题

  • 补充本
    • 零碎
    • 语法
      • 默认参数
      • new动态规划数组初始化
      • 关系运算符\赋值符
      • 宏定义
      • 引用和new
      • 二维数组
      • 1
      • 2
      • 匿名对象
      • struct与typedef
      • 同步与异步
      • sleep()
      • 时间戳(计时)
      • 枚举
    • esay x
      • 其他
      • 地图打印(利用二维数组)
      • 双缓冲
      • 颜色和格式的设置
      • 键盘的输入
      • 界面的设计
      • 按钮和鼠标
        • 按钮
        • 鼠标
        • 鼠标经过时变色
      • 查阅帮助文档
      • 将某段文字放在某个位置

补充本

零碎

1\ 调用无参构造函数的时候 不能加括号 直接Person p; 即可
2\在函数之外 只能写变量的定义(包括定义时的初始化)以及函数的声明,具体的执行语句只能在函数体之内进行
如下是犯的一个很蠢的错误
错题本 补充本_第1张图片

语法

默认参数

在这里插入图片描述
函数参数列表规定了某个参数的值的话 在函数调用时 可以不传这个位置的参数 该参数有一个默认值

new动态规划数组初始化

错题本 补充本_第2张图片

直接在后面进行大括号初始化即可

关系运算符\赋值符

== 与 =

如果想在一个循环里选出一些特别的值 那么
不可以单纯加一个if(){}
还要加else

不然运行完if后 还会去运行if下面的语句

宏定义

在这里插入图片描述
宏定义最后端不可以加分号

引用和new

错题本 补充本_第3张图片

错题本 补充本_第4张图片
在重构赋值运算符时 重构函数体内要进行两个对象属性值的赋值 (将b对象的属性值赋值给a对象)

对于第一行 是默认调用编译器提供的浅拷贝 注意第一张图 Person类的age是指针类型变量 所以p.age是指针变量,而this->age也是指针类型变量 所以编译通过,指针赋值指针;

对于第二行 我们进行深拷贝 也就是将要赋值的值在堆区开辟空间 并把数据放进去,用到new
new的语法: new 数据类型(初始值)
所以括号里应该传入一个实体值 而p.age 是类Person的属性值 通过类的定义可以看到 p.age是一个指针 所以不能直接传入 而是应该解引用 从而是一个实体值;

注意 参数是Person &p 这里将p视为一个变量 一个Person类型的变量 也就是类的对象 p是实参对象的别名 并不是地址 只不过p和实参对象共用一块地址

返回值是Person& 那么return的数据(return的值会替代函数名 也就是函数调用时 函数名最终就是return后面的数据) 必须是Person的实体变量 因为引用类型的变量定义是 数据类型& 别名=变量名
只有return一个实体变量 才能满足&后面是一个变量别名

二维数组

1

错题本 补充本_第5张图片
定义一个指针类型为基本元素的数组,再对每个元素分别都new一个数组并且用数组的元素名接住

注意 最后析构的时候 也要把每个数组名的数组都析构掉 并且析构掉大数组

(可以参照new一维数组的方法来对照着记二维数组)

new后面是每个元素的数据类型 当数据类型加了一个星星的时候 每个元素的数据类型就变成了指针 这样就可以对每个元素再次进行new了
当看到后面加了星星 前面补一个*就可以

2

错题本 补充本_第6张图片

匿名对象

错题本 补充本_第7张图片

正常对象:
A a(10);

匿名对象:
A(10);
直接调用构造函数 没有对象接住 那么这个整体就是匿名对象
匿名对象的生命周期:
该匿名对象使用完之后 就会被析构 也就是匿名对象所在行执行完 就会被析构

struct与typedef

错题本 补充本_第8张图片

struct是结构体类型

typedef是给类型起别名
对于第一个:数据类型是struct{int val;} 这整个(包括花括号里的内容一起)是一个数据类型的声明(也称为匿名结构体),后面跟了A,那么A就是该结构体类型的变量

对于第二个:结构体类型声明有了名称:A 而B是A结构体的变量

第三个:struct{int val;} 这整个(包括花括号里的内容一起)是一个数据类型的声明(也称为匿名结构体),
先是一个匿名结构体 之后用typedef给匿名结构体起别名 所以 A就是匿名结构体的别名 A这次不再是变量 而是结构体的名称 是数据类型的声明

第四个:对结构体C 起别名
第一个别名是A:所以A也是结构体类型的声明 而不是结构体变量
第二个别名是B 这里的B等价于C 但是可以利用B进行指针的操作
因为C是结构体类型 所以 等价于 C 星 变量
星B 变量
!B是指向结构体的指针!

同步与异步

在这里插入图片描述

sleep()

在这里插入图片描述

时间戳(计时)

错题本 补充本_第9张图片
clock_t是一种类型 它定义的变量可以存储时间瞬时值

clock()是一个函数 可以返回当前的时间戳 也就是当前时间距离1970年1月1日0.0.0的时间差

这两个配合 可以进行计时操作

错题本 补充本_第10张图片
补充:可以进行游戏帧率的设置
错题本 补充本_第11张图片

枚举

错题本 补充本_第12张图片

esay x

其他

错题本 补充本_第13张图片

地图打印(利用二维数组)

错题本 补充本_第14张图片

错题本 补充本_第15张图片

双缓冲

当我们绘制一张图 然后另一张图盖住前一张图的某个部分的时候 由于while的存在 会导致 两张图不停的闪烁 所以加入双缓冲可以解决这个问题
错题本 补充本_第16张图片
开启双缓冲 之后等待Flush或者End 才会进行图片的绘制 不然不会进行图片的绘制,这样就可以保证每次while的执行 都是以一整套为单位进行的 执行到双缓冲状态结束或者flush 才将之前的内容同时绘制 也就是蓝色和白色同时绘制(这样虽然每次都在循环绘制 但是每一次绘制的效果一样 就不会出现闪烁) 而不是蓝色先绘制 之后白色再绘制

有以下两种方式
错题本 补充本_第17张图片
错题本 补充本_第18张图片
注意::
错题本 补充本_第19张图片
如果开启双缓冲状态之后 中途进行了函数的跳转 那么函数里要将双缓冲状态结束 不然一直没有结束双缓冲状态的话 函数里的绘图也不会进行绘制 而是等待双缓冲状态的结束

颜色和格式的设置

错题本 补充本_第20张图片
错题本 补充本_第21张图片
设置颜色和格式都是设置了一种状态 在这之后的填充都会采用这种状态 所以设置状态要在真正填充之前 所以每次填充之前最好都设置一次状态

键盘的输入

错题本 补充本_第22张图片
_kbhit() 以及_getch()都是控制台函数 会导致操作与界面割裂开 所以建议使用Get这个函数 该函数直接传入一个大写w即可包含小写w,因为他的参数是虚拟键
错题本 补充本_第23张图片

补充:VC虚拟值表 可放入GetAsyncKeyState的参数

https://blog.csdn.net/qq_42372031/article/details/105178789

界面的设计

错题本 补充本_第24张图片

按钮和鼠标

按钮

错题本 补充本_第25张图片
设置文本所占矩形的位置坐标 对于横轴 先将文本矩形的左边像素坐标移动到按钮的中间 之后 减去文本矩形像素的一半 就可以实现左边一半右边一半 就可以对齐了
纵轴同理
错题本 补充本_第26张图片

鼠标

错题本 补充本_第27张图片
先对鼠标的状态进行设置,采用枚举类型

同时定义全局变量 Message msg; 或者 ExMessage msg;

错题本 补充本_第28张图片
定义鼠标状态函数 获取在某一时刻 各个按钮内的鼠标状态

之后 获取到鼠标的位置 是否在按钮中间 并对鼠标是否点击进行判断 并返回枚举变量

鼠标状态判断函数的参数是按钮的结构体变量,也就是对每个按钮分别判断 以按钮为视角 看鼠标是否在该按钮内 一个按钮一个按钮的方式进行判断

错题本 补充本_第29张图片
参数分别是三个按钮 返回值分别是在目前的时刻 鼠标在三个按钮的状态
在绘图函数里调用判断鼠标状态
if(peekmessage(&msg,EX_MOUSE))用来判断鼠标是否点击在当前程序 有可能鼠标在该程序以外的地方操作

鼠标经过时变色

在这里插入图片描述
首先对按钮的绘制函数进行颜色的参数设置,方便后续更改 注意 颜色宏定义的类型是int类型

错题本 补充本_第30张图片
注意画按钮的函数 参数先添加一个颜色变量

之后 函数体里填充按钮颜色的参数也要改为buttoncolor 不可以再使用自己规定死的颜色了

错题本 补充本_第31张图片
之后 将状态整数放在while外面 使其作用域包含整个while

注意点:只要画面要进行动态变化的 都要放入循环里 所以 按钮绘图也要放入循环
然后用三目运算符进行传参数

查阅帮助文档

(以textwidth为例)

错题本 补充本_第32张图片
注意 要严格按照文档参数类型的规定 去写代码
如上图 规定参数是LPCTSTR类型的字符串 那么在程序中就要这样定义
错题本 补充本_第33张图片

将某段文字放在某个位置

错题本 补充本_第34张图片
用到outtextxy函数 其中参数分别为 第一个字母的x坐标 第一个字母的y坐标 文本

如下图 注意 必须是LPCTSTR类型的字符串
错题本 补充本_第35张图片

你可能感兴趣的:(算法,c++)