
C++
C++
Whitemeen太白
这个作者很懒,什么都没留下…
展开
-
“int”到“char”截断的编译原理(关于char c = ‘\0xab’的研究)
#include <stdio.h>void main() { char c1 = '\111111'; char c2 = '\111aaa'; char c3 = '\aaaa'; char c4 = '\aa11'; char c5 = '1111'; char c6 = 'aaaa'; printf(" c1=%c\n c2=%c\n c3=%c\n c4=%c\n c5=%c\n c6=%c\n",c1,c2,c3,c4,c5,c6);}c1~c6 都为可接原创 2021-11-13 21:53:31 · 2819 阅读 · 0 评论 -
条件编译的用法
条件编译预处理程序提供了条件编译的功能,可以按不同的条件去编译不同的程序部分,因而产生不同 的目标代码文件,这对于程序的移植和调试是很有用的。条件编译可分为三种形式。第一种形式如下:#ifdef 标识符 程序段 1 #else 程序段 2 #endif 它的功能是如果标识符已被 #define 命令定义过则对程序段 1 进行编译;否则对程序段 2 进行编译。如果没有程序段 2(为空),本格式中的#else 可以没有,即可以写为:#ifdef 标识符 程序段 #endif 第二种原创 2021-11-11 17:29:21 · 2489 阅读 · 0 评论 -
完全二叉树的判断实现
参考层序遍历的算法,利用队列作为储存结构,将二叉树从上到下,从左到右遍历,对于完全二叉树来说,一旦队列中读到空指针,则必定已将二叉树遍历完全了,否则若空指针后还有为访问的元素,则不是完全二叉树,代码如下//判断是否为完全二叉树Status judge_completeBiTree(BiTree T){ if(!T) return OK; SqQueue Q; BiTree p; p=T; InitQueue(&Q);//初始化队列 EnQueue(&Q,p);//根结点入队原创 2021-06-30 10:21:24 · 183 阅读 · 0 评论 -
C/C++平衡二叉树实现 —— 插入、删除、先序遍历、中序遍历、后序遍历、层序遍历(设计详解)
输出展示:前言该程序由c语言编写,可运行于vs环境下,可轻易转换成C++代码。一、实现功能实现操作:结点的插入、删除。实现输出:输出先序遍历、中序遍历、后序遍历、层序遍历的结果。二、代码设计1. 定义平衡二叉树的结点结构平衡二叉树的结点结构:// 平衡二叉树的结点结构typedef struct BiTNode{ int data; int bf; // 平衡因子 BiTNode* lchild, * rchild;}BiTNode,原创 2021-06-12 11:36:07 · 876 阅读 · 3 评论 -
MFC 设置对话框背景和边框颜色
对于对话框,只需要重载默认的消息处理函数就行了:重载默认的消息处理函数,主要处理WM_MOVE WM_PAINT WM_NCPAINT WM_NCACTIVATE WM_NOTIFY这几个消息就可以了。重载默认的消息处理函数:LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam){ LRESULT lrst=CDialog::DefWindowProc(message, wParam, lPar原创 2021-06-11 15:44:41 · 3913 阅读 · 1 评论 -
LNK2019 无法解析的外部符号 “public: void __thiscall XXX...” —— 关于MFC中C++模板类报错问题
原因:c++在写模版函数时(template之类的),头文件不能与cpp文件分离。这就意味者,你头文件定义的含模版的地方必须在头文件中实现,没用模版定义的地方可以放在cpp中实现。如果要分离在.h和.cpp中,那么要用export关键词,可是目前很少有编译器支持,这个是很有争议的一个关键字。所以,检测是否将模板类的成员函数的定义和实现分别放在了.h和.cpp里面?如果是的,请将他们放在同一个文件里面。或者避免声明成模板类。比如这样:class Caculator{public: // 声原创 2021-06-11 15:37:50 · 524 阅读 · 1 评论 -
MFC 在对话框中绘制图形的方法 —— 及二叉树绘制实例
绘制图形// 清空绘制区域CRect rectDlg;GetClientRect(rectDlg); //获得窗体的大小int pointWidth = rectDlg.Width(); //获取窗体宽度int pointHeight = rectDlg.Height(); //获取窗体高度RedrawWindow(CRect(0, 0, pointWidth, pointHeight)); //重绘指定区域// 绘制int x = 200; // 绘制处x坐标int y = 1原创 2021-06-11 15:17:23 · 2722 阅读 · 1 评论 -
MFC 获取控件在对话框上的坐标
MFC上获取控件坐标的问题,后来查了查资料,其实很简单的,也就几个函数的应用,还有就是对应坐标的转换。void MFCTestDlg::OnMatch(){ CRect rectL,rectR; //获取控件相对于屏幕的位置 GetDlgItem(IDC_PIC1)->GetWindowRect(&rectL); //转化为对话框上的相对位置 ScreenToClient(rectL); int height = rectL.bottom-rectL.top; //heig原创 2021-06-11 14:51:58 · 2377 阅读 · 1 评论 -
MFC 清除、重绘对话框上指定区域绘制的图形
清除、重绘对话框上指定区域绘制的图形:// 清空绘制区域CRect rectDlg;GetClientRect(rectDlg); // 获得窗体的大小int pointWidth = rectDlg.Width(); // 获取窗体宽度int pointHeight = rectDlg.Height(); // 获取窗体高度RedrawWindow(CRect(0, 0, pointWidth, pointHeight)); // 重绘指定区域...原创 2021-06-11 14:46:19 · 6255 阅读 · 0 评论 -
MFC 屏蔽ESC键和ENTER键关闭对话框的方法
重载PreTranslateMessage()函数,在这个函数里捕捉ESC键和ENTER键按下时的消息,然后什么都不做,或是添加代码完成自己想要实现的功能。1. 屏蔽ESC键与ENTER回车键BOOL CTest1Dlg::PreTranslateMessage(MSG* pMsg){ if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_RETURN) return TRUE; if(pMs原创 2021-06-11 14:09:49 · 1870 阅读 · 1 评论 -
随机存取、顺序存取、随机存储和顺序存储
随机存取、顺序存取、随机存储和顺序存储这四个概念是完全不一样的,切不可将之混淆很多人包括我可能认为随机存取就是随机存储,顺序存取就是顺序存取,其实不是这样。下面完整的介绍一下这4个概念存取结构:分为随机存取和非随机存取(又称顺序存取) 1、随机存取就是直接存取,可以通过下标直接访问的那种数据结构,与存储位置无关,例如数组。非随机存取就是顺序存取了,不能通过下标访问了,只能按照存储顺...原创 2019-12-09 10:43:25 · 2711 阅读 · 1 评论 -
内存溢出、内存泄漏——解析
泄漏就是内存申请后,用完没有释放,造成可用内存越来越少。溢出指用户实际的数据长度超过了申请的内存空间大小,导致覆盖了其他正常数据,容易造成程序异常,严重的,攻击者可以以此获取程序控制权。作者:McAce链接:https://www.zhihu.com/question/40560123/answer/512873873来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注...原创 2019-10-22 20:42:40 · 494 阅读 · 0 评论 -
浅复制(copy)和深复制(deepcopy)
源代码: Lib/copy.pyPython 中赋值语句不复制对象,而是在目标和对象之间创建绑定 (bindings) 关系。对于自身可变或者包含可变项的集合对象,开发者有时会需要生成其副本用于改变操作,进而避免改变原对象。本模块提供了通用的浅层复制和深层复制操作(如下所述)。接口摘要:copy.copy(x)返回 x 的浅层复制。copy.deepcopy(x[, memo])返回 x 的深层复制。exception copy.error针对模块特定错误引发。浅层复制和深层复制之间原创 2020-10-15 23:01:38 · 1491 阅读 · 0 评论 -
MFC 类型互转方案整理
系列文章目录文章目录系列文章目录前言一、int -> CString(1)`Format()方案`二、string -> CString :(1)`c_str()方案`(2)`CA2T()方案`三、string -> LPCTSTR :(1)`MultiByteToWideChar()方案`五、CString -> int(1)`atoi()或_ttoi()方案`四、CString -> string :(1)`CStringA()方案`(2)`CStringW()、CSt原创 2021-06-11 00:37:28 · 969 阅读 · 0 评论 -
C++中栈和堆上建立对象的区别
在C++中类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* p=new A(),Ap=(A)malloc();静态建立一个类对象,是由编译器为对象在栈空间中分配内存,通过直接移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。动态建立类对象,是使用new运算符将对象建立在堆空间中,在栈中只保留了指向该对象的指针。栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值,对象的引用地址等。其操作方式类似于数据结构中的栈,通常都是被调用时处于存储空间中,调用完毕原创 2021-06-11 13:08:33 · 263 阅读 · 2 评论 -
C++创建对象的三种方式
#include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0; }原创 2021-06-11 13:05:23 · 714 阅读 · 0 评论 -
size_t 和 size_type
size_t 在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。vector使用的下标实际也是size_t,源码是typedef size_t size_type。 size_t是标准C库中定义的,在64位系统中为long long unsigned int,非64位系统中为long unsigned int。&nb原创 2020-12-19 00:39:31 · 459 阅读 · 1 评论