1\ 调用无参构造函数的时候 不能加括号 直接Person p; 即可
2\在函数之外 只能写变量的定义(包括定义时的初始化)以及函数的声明,具体的执行语句只能在函数体之内进行
如下是犯的一个很蠢的错误
函数参数列表规定了某个参数的值的话 在函数调用时 可以不传这个位置的参数 该参数有一个默认值
直接在后面进行大括号初始化即可
== 与 =
如果想在一个循环里选出一些特别的值 那么
不可以单纯加一个if(){}
还要加else
不然运行完if后 还会去运行if下面的语句
在重构赋值运算符时 重构函数体内要进行两个对象属性值的赋值 (将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一个实体变量 才能满足&后面是一个变量别名
定义一个指针类型为基本元素的数组,再对每个元素分别都new一个数组并且用数组的元素名接住
注意 最后析构的时候 也要把每个数组名的数组都析构掉 并且析构掉大数组
(可以参照new一维数组的方法来对照着记二维数组)
new后面是每个元素的数据类型 当数据类型加了一个星星的时候 每个元素的数据类型就变成了指针 这样就可以对每个元素再次进行new了
当看到后面加了星星 前面补一个*就可以
正常对象:
A a(10);
匿名对象:
A(10);
直接调用构造函数 没有对象接住 那么这个整体就是匿名对象
匿名对象的生命周期:
该匿名对象使用完之后 就会被析构 也就是匿名对象所在行执行完 就会被析构
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是指向结构体的指针!
clock()是一个函数 可以返回当前的时间戳 也就是当前时间距离1970年1月1日0.0.0的时间差
这两个配合 可以进行计时操作
当我们绘制一张图 然后另一张图盖住前一张图的某个部分的时候 由于while的存在 会导致 两张图不停的闪烁 所以加入双缓冲可以解决这个问题
开启双缓冲 之后等待Flush或者End 才会进行图片的绘制 不然不会进行图片的绘制,这样就可以保证每次while的执行 都是以一整套为单位进行的 执行到双缓冲状态结束或者flush 才将之前的内容同时绘制 也就是蓝色和白色同时绘制(这样虽然每次都在循环绘制 但是每一次绘制的效果一样 就不会出现闪烁) 而不是蓝色先绘制 之后白色再绘制
有以下两种方式
注意::
如果开启双缓冲状态之后 中途进行了函数的跳转 那么函数里要将双缓冲状态结束 不然一直没有结束双缓冲状态的话 函数里的绘图也不会进行绘制 而是等待双缓冲状态的结束
设置颜色和格式都是设置了一种状态 在这之后的填充都会采用这种状态 所以设置状态要在真正填充之前 所以每次填充之前最好都设置一次状态
_kbhit() 以及_getch()都是控制台函数 会导致操作与界面割裂开 所以建议使用Get这个函数 该函数直接传入一个大写w即可包含小写w,因为他的参数是虚拟键
补充:VC虚拟值表 可放入GetAsyncKeyState的参数
https://blog.csdn.net/qq_42372031/article/details/105178789
设置文本所占矩形的位置坐标 对于横轴 先将文本矩形的左边像素坐标移动到按钮的中间 之后 减去文本矩形像素的一半 就可以实现左边一半右边一半 就可以对齐了
纵轴同理
同时定义全局变量 Message msg; 或者 ExMessage msg;
之后 获取到鼠标的位置 是否在按钮中间 并对鼠标是否点击进行判断 并返回枚举变量
鼠标状态判断函数的参数是按钮的结构体变量,也就是对每个按钮分别判断 以按钮为视角 看鼠标是否在该按钮内 一个按钮一个按钮的方式进行判断
参数分别是三个按钮 返回值分别是在目前的时刻 鼠标在三个按钮的状态
在绘图函数里调用判断鼠标状态
if(peekmessage(&msg,EX_MOUSE))用来判断鼠标是否点击在当前程序 有可能鼠标在该程序以外的地方操作
首先对按钮的绘制函数进行颜色的参数设置,方便后续更改 注意 颜色宏定义的类型是int类型
之后 函数体里填充按钮颜色的参数也要改为buttoncolor 不可以再使用自己规定死的颜色了
之后 将状态整数放在while外面 使其作用域包含整个while
注意点:只要画面要进行动态变化的 都要放入循环里 所以 按钮绘图也要放入循环
然后用三目运算符进行传参数
(以textwidth为例)
注意 要严格按照文档参数类型的规定 去写代码
如上图 规定参数是LPCTSTR类型的字符串 那么在程序中就要这样定义