c++
c++ 知识点
清水迎朝阳
多年windows下c++客户端开发,或多或少踩了很多坑,积累了一些经验
展开
-
c++调用第三方进程的方式
但是Shell方式,我发现一个问题。在程序的最后调用时,很可能调用失败。原创 2022-09-22 15:38:14 · 763 阅读 · 0 评论 -
一个c++ 日志类,可直接用
这是我项目中,使用的C++日志类,只需添加头文件、源文件后,就可使用。原创 2022-09-02 16:14:28 · 374 阅读 · 0 评论 -
SHFileOperation 文件拷贝、移动、删除等操作
【代码】SHFileOperation 文件拷贝、移动、删除等操作。原创 2022-09-02 15:54:12 · 510 阅读 · 0 评论 -
windows 下 c++ 二维码生成库
这三个唯一一个不依赖其它库的是 QR-Code-generator, 但缺点也很明显,不支持生成图片 , 纯算法, 不生成图片,当然也不依赖第三方库。重点研究的libqr, 发现依赖库主要用在生成png TIFF 图片格式上,如果只生成BMP的话,则不需要额外依赖库,所以重点改造了这个库。libqr,因为支持了png,所以有了依赖项目,而我实际工作中,只需要生成BMP就行了。因此,最好只需要头文件 c文件,就能实现最好,不要额外的lib文件、更不要dll文件。qr.h中,将宏定义置空。原创 2022-08-22 15:13:45 · 2661 阅读 · 3 评论 -
c++内存泄漏解决方案
使用C++,不可避免的会遇到内存泄漏问题,遇到这个问题怎么办呢?我是一般从这几个方面考虑:第1种、显性的 new malloc delete free 是否匹配 这是最基本的,也就不多说了。第2种、隐形的,这个就较为复杂了 之所以说是隐形的,是因为他们没有调用new malloc ,但你不注意的情况下,也有可能造成内原创 2017-11-24 11:11:18 · 3070 阅读 · 0 评论 -
不能将“this”指针从“const CPaopao”转换为“CPaopao &
CPoint CPaopao::GetCenter() { return rc.CenterPoint(); } float CPaopao::Distance(const CPaopao& ortherPaopao){ CPoint pt1=GetCenter(); CPoint pt2=ortherPaopao.GetCenter();原创 2017-04-25 15:18:55 · 4028 阅读 · 0 评论 -
分隔符,解析字符串
一:使用Tokenize分隔字符串时候,两个连续的字符串 被视为一个//解析学生信息: 郑丽恩\t\t 163 \t 2 \t 3void ParseStudentInfo(CString stuInfo, std::vector &strVec){ strVec.clear(); CString sperator = L"\t"; CString tokenStr;原创 2017-02-25 14:14:48 · 1068 阅读 · 0 评论 -
vector.resize 与 vector.reserve的区别
reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。再者,两个函数的形式是有区别的,reserve函数之原创 2008-12-23 11:40:00 · 33113 阅读 · 8 评论 -
用事件判定线程的结束与否
本文由 代码助手软件 整理发布 内容与本软件无关 更惬意的读、更舒心的写、更轻松的发布HANDLE g_hTic1=CreateEvent(NULL,TRUE,TRUE,NULL); //自动复原 有信号UINT Tic1(LPVOID pTView){ ResetEvent (g_hTic1);//重置为无信号 CMyV原创 2014-12-25 17:12:43 · 1228 阅读 · 0 评论 -
在堆上申请一个容器空间
C++中变量和对象有两种创建方式,一种是创建在栈上,一种是创建在堆上然后通过指针引用。当然list容器也是一致的。 list容器的创建: list myList; list *yourList=new list; list动态数组的创建:原创 2009-10-16 14:37:00 · 1792 阅读 · 0 评论 -
VECTOR容器总结
1 清空所有元素m_itemVector.clear();2 遍历 vector::iterator iter=m_itemVector.begin(); for(i=0;iter!=m_itemVector.end();iter++,i++) { if(iter->flag==-1) { break; } iter->flag=1原创 2013-06-27 12:57:26 · 1407 阅读 · 0 评论 -
对vector等STL标准容器进行排序操作
西方有句谚语:不要重复发明轮子!STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已不用拘泥于算法本身,从而站在巨人的肩膀上去考虑更高级的应用。排序是最广泛的算法之一,本文详细介绍了STL中不同排序算法的用法和区别。1 STL提供的Sort 算法C++之转载 2013-06-27 12:56:58 · 1282 阅读 · 0 评论 -
DWORD WORD BYTE 相互转换
DWORD WORD BYTE 相互转换 DWORD 4个字节 WORD 2个字节 BYTE 1个字节 1) DWORD--->WORD DWORD dw=0; WORD hW=HIWORD(dw); WORD lW=LOWORD(lw);2)WORD--->DWORD DWORD dw=0;原创 2012-05-08 17:19:14 · 17887 阅读 · 0 评论 -
exit()和return语句的区别
(一)exit用于结束正在运行的程序,exit函数将参数是返回给OS。而return是返回函数值并退出函数。(二)return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。(三)在main函数(其代表一个进程)结束时会隐式地调用exit函数。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程。所以一般程序执行到 main转载 2011-08-17 15:03:23 · 973 阅读 · 0 评论 -
字符数组,字符指针,Sizeof总结
Sizeof与字符串 1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写 "abc",那么编译器帮你存储的是"abc/0" 2."abc"是常量吗?答案是有时是,有时不是。 不是常量的情况:"abc"作为字符数组初始值的时候就不是,如 char str[] = "abc"; 因为定义的是一个转载 2011-06-24 11:58:00 · 4362 阅读 · 0 评论 -
1 2 3 4 5 6 7 8 9=10 各个数可正可负 如何等于10
<br /> <br /> <br /> 今天同事给了一个这样的问题 <br /> 是一个初一学生问他的,结果没做出来,就告诉那学生,这道题出错了<br /> 学生回他:你不会做,就别说题错了 找借口<br /> 额,很是尴尬<br /> 今天,拿这道题来问我们<br /> <br /> <br /> 1 2 3 4 5 6 7 8 9=10<br /> <br /> 我想了很多可能,都没有得出10这个数<br /> <br /> 只好编个程序来实现<br /> <br原创 2010-09-02 13:11:00 · 12303 阅读 · 0 评论 -
fscanf的返回值未成功输入的元素个数
test.txt 中保存的为:12345 程序 int i,j,k; FILE *fp=fopen("e://test.txt","r"); if (fp==NULL) { //return FALSE; } while (!feof(fp)) { j=fscanf(fp,"%d%原创 2009-10-19 13:06:00 · 4244 阅读 · 0 评论 -
MSDN 中 对vector::erase()的解释
vector::eraseRemoves an element or a range of elements in a vector from specified positions.iterator erase( iterator _Where);iterator erase( iterator _First, it原创 2009-10-16 14:05:00 · 1693 阅读 · 0 评论 -
erase() 返回的是删除此元素之后的下一个元素的迭代器
比如:我写的一个程序中,要删除某个位置的元素 for(list>::iterator pos=point_to_file_list.begin();pos!=point_to_file_list.end();pos++) { for (list::iterator pos_line=(*pos).begin();pos_line!=(*pos)原创 2009-10-16 13:51:00 · 1360 阅读 · 0 评论 -
容器的范围
vect list 等容器的范围是一个[begin,end)类型 也就是 其iterator::begin() 为容器的第一个元素 但是 iterator::end() 不是容器的最后一个元素,而是容器最后一个元素的下一个元素 常用iterator::end()判断是否到末尾原创 2009-10-16 13:22:00 · 720 阅读 · 0 评论 -
STL中的排序算法zz
STL中有多种排序算法,各有各的适用范围,下面听我一一道来:I、完全排序 sort() 首先要隆重推出的当然是最最常用的sort了,sort有两种形式,第一种形式有两个迭代器参数,构成一个前开后闭的区间,按照元素的 less 关系排序;第二种形式多加一个指定排序准则的谓词。sort基本是最通用的排序函数,它使用快速排序算法,并且在递归过程中,当元素数目小于一个阈值(一转载 2009-10-14 17:04:00 · 1149 阅读 · 0 评论 -
C++标准库排序方法大全
这个题目有点儿无聊,跟茴香豆的“茴”字有几种写法一样无聊,又是一个无聊的老掉牙的话题——排序,问题依然是无聊至极——把输入的单词按顺序(我可没说是什么顺序)排列。当作是一个总结吧。 按词典排好说,如果你用vector words存储单词,只需用algorithm里的sort即可:sort(words.begin(),words.end())。这玩意儿我转载 2009-10-14 16:38:00 · 4437 阅读 · 0 评论 -
list 容器 排序函数
struct Point{ double x,y,z;}; 制定排序规则,重载()运算符: (一) 按x值的大小 进行升序排序 class ascend_x{public: bool operator()(const Point &t1,Point &t2) {return t1.x}; (二) 按y值的大小 进行升序排序cla原创 2009-10-14 16:31:00 · 2317 阅读 · 0 评论 -
检测输入/输出的状态标志
在此我不打算解释“标志(flags)”一词的含义,不过假如你真的完全不理解关于这方面的概念,那么将本章读过一遍之后也许你对此会得到一些认识,我也相信你同样能理解这部分的理论。尽管如此,如果你还是不明白标志在C++中的含义,我推荐你阅读一些关于这个主题的资料。好,让我们开始吧。 C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息转载 2009-10-14 15:28:00 · 1630 阅读 · 0 评论 -
cin.fail(), cin.bad(), cin.good(), cin.clear(), cin.ignore()
在前一节中我们有几个例子中提到了cin函数出错,以致不再执行读操作(程序8)。而且我们经常会看到程序中会出现 cin.clear(),cin.ignore(), cin.fail()等函数。这些函数都是与cin的错误处理有关的。这一节我们来分析一下cin的错误处理机制,并且学习几个重要的函数:cin.fail(), cin.bad(), cin.good(), cin.cle转载 2009-10-14 15:39:00 · 10276 阅读 · 6 评论 -
引用类型的方便性
在对话框类 CDlg 中定义了一成员变量 在另一个类B中希望得到该成员变量的信息 于是,在B中写了一个成员函数Func(CDlg dlg ), 并将其作为CDlg的友元函数,使其可以访问其私有数据 在对话框中希望传送对话框信息给dlg 使用了 Func(*this) 但是编译时出错 ,提示 对话框拷贝构造不行等信息。 个人理原创 2009-09-28 11:05:00 · 690 阅读 · 0 评论 -
先声明再定义的必要性
类A定义 在A.h中 实现在A.cpp 类B定义 在B.h中 实现在B.cpp 在类A中需要引用类B的类型 而类B也需要引用类A的类型 这样 如果在类A.h加如#include"B.h" 在类B.h加入#include"A.h" 会出现什么原创 2009-09-28 10:31:00 · 2325 阅读 · 0 评论 -
关于类型转换 此作者总结的很好
刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。我们先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君";转载 2009-09-25 17:45:00 · 799 阅读 · 1 评论 -
二级指针的作用及用途
之所以定义二级指针**P,不是为了使用**P表示指向的值,而是为了使用*P来存储存储值的那个单元的地址。 Void GetMemory2(char **p, int num){*p = (char *)malloc(num);}void Test(void){char *str = NULL;GetMemory(&str, 10原创 2009-04-21 19:54:00 · 5201 阅读 · 2 评论 -
小数点输出精度控制问题
setf()是追加标志字的函数,而flags()是设置标志字 fixed标志是以定点形式显示浮点数 当有fixed标志时,说明数据按一定的位数输出,否则去掉fixed标志后,数据按原位输出---即小数最后面的0不显示 因此,使用时有两种情况: (1)原位输出,这时应去掉fixed标志: cout。unsetf(ios::fixed)原创 2009-03-29 17:32:00 · 4548 阅读 · 0 评论 -
int (*p)[4] p 是二级指针 二维数组 二级指针
试验一:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int (*p)[4];for(p=&a[0];pcout0012FF400012FF400012FF40for(p=&a[0];pcout0012FF440012FF540012FF64for(p=&a[0];pcout0012FF440012FF540012FF64for(p=&a[0];p原创 2008-11-27 13:08:00 · 2520 阅读 · 0 评论 -
new 动态分配数组空间
(一)定义一个整数 int *p =new int; int *p =new int(4); //赋初值4 (二)定义一个一维数组 int *p =new int[SIZE]; P 指向的为数组的首地址,数组是以int类型为基本单元的,p作为数组名使用 (三)定义一个二维数组 int(*原创 2008-11-17 16:13:00 · 9858 阅读 · 2 评论 -
编译器如何解释基类指针
原创 2008-10-29 11:38:00 · 883 阅读 · 0 评论 -
基类,派生类,内存分配情况
派生类继承基类 内存分配时,是在于基类对象不同的内存地址处,按基类的成员变量类型,开辟一个同样的类型空间,但注意开辟后派生对象的空间,不是复制基类的成员的值,而是仅仅开辟那种成员类型的空间,未初始化时,里面存在的数是不确定的 然后派生类自己定义的成员变量是排在继承的A类成员下面,如果派生类定义的变量名与基类相同,则此变量覆盖掉继承的基类同名变量,注意,覆盖不是删除,原创 2008-10-28 10:32:00 · 5086 阅读 · 4 评论 -
虚函数类空间分配(虚函数表)
示例中派生类没有重新定义相同的虚函数,所以没有对基类虚函数进行覆盖,而自定义的虚函数位于虚函数表中基类虚函数的后面原创 2008-10-28 21:02:00 · 1230 阅读 · 0 评论 -
分享一个很好的 线程互斥的类
在使用网易云信duilib时,发现的这个互斥类,特此分享下c++临界区对象CRITICAL_SECTIONtypedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // // The following three fields control ...原创 2019-09-18 17:25:51 · 275 阅读 · 1 评论 -
DLL动态加载示例
以网易播放器DLL为例将DLL放在单独的文件夹内加载 DLLvoid Player::LoadPlayerDll(){ if (instance_player_ == NULL) { std::wstring dll_path = nbase::win32::GetCurrentModuleDirectory() + L"nim_player\\" + kSd...原创 2019-09-19 17:24:05 · 340 阅读 · 0 评论