C++学习基础
C++ 基础知识,基本源自C++ Primer 第5版本
欧特克_Glodon
C++开发Qt/MFC,三维可视化OpenGL/osg/cesium,GIS应用开发,矿山智能通风算法研究,AutoCAD二次开发(Arx开发)。
展开
-
C++异步回调示例:多线程执行任务,主线程通过回调监测任务状态
C++异步回调示例:多线程执行任务,主线程通过回调监测任务状态原创 2024-04-18 10:32:09 · 1480 阅读 · 0 评论 -
关于C++ std::sort排序的使用:对象排序和对象指针排序的区别
关于C++ std::sort排序的使用:对象排序和对象指针排序的区别原创 2024-01-24 11:30:29 · 581 阅读 · 0 评论 -
C++多态特性:virtual关键字的使用
C++多态特性:virtual关键字的使用原创 2023-10-07 10:27:12 · 368 阅读 · 0 评论 -
VS警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
VS警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失原创 2023-08-27 21:55:11 · 1563 阅读 · 0 评论 -
c++比较日期大小
C++用来比较两个日期,日期格式:2023-03-31 09:16:56。原创 2023-04-04 14:34:49 · 1093 阅读 · 0 评论 -
快速看懂C++设计模式:观察者模式实例代码
观察者模式是目前应用最广、影响范围最大的模式之一,因为 Observer 的一个实例 MVC结构(Model/View/Control )在系统开发架构设计中有着很重要的地位和意义, MVC实现了业务逻辑和表示层的解耦。在 MFC 中, Doc/View(文档视图结构)提供了实现 MVC 的框架结构,同样Qt中核心机制:信号和槽的实现也同样有观察者的影子。原创 2023-03-03 15:15:48 · 332 阅读 · 0 评论 -
如何用VS2010创建并生成动态链接库
在某些应用程序场景下,需要将一些类或者方法编译成动态链接库dll,以便别的.exe或者.dll文件可以通过第三方库的方式进行调用,下面就简单介绍一下如何通过VS2010来创建动态链接库。原创 2022-12-20 23:43:24 · 3517 阅读 · 2 评论 -
C++如何在崩溃时捕获异常后且生成dump调试文件
windows程序在运行时有时候会发生未知的异常错误,有时候调试也不太好定位,此时就需要加载调试dump文件来查找异常,因此需要生成dump异常文件。原创 2022-09-15 15:48:59 · 1236 阅读 · 1 评论 -
C++关于导出*.dll文件中的函数方法
第一种:在类名或者函数名前面加__declspec(dllexport), 在使用的地方用__desclspec(dllimport)。第二种:在def文件里加相应的导入函数或者导入类。原创 2022-08-31 15:05:30 · 655 阅读 · 0 评论 -
C++11新特性:std::function使用详解
std::function是一个函数包装模板,可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常。原创 2022-08-22 13:44:13 · 812 阅读 · 0 评论 -
常量指针int * const p和指向常量的指针const int *p区别 指针函数与函数指针
关于常量指针int * const p和指向常量的指针const int *p,总是容易把人给绕晕,但是仔细分析加上几个简单的例子介绍,则可以比较容易的分清其中的逻辑。看const紧跟的对象是谁。常量指针int * const p:主语在指针上,const修饰的是指针也就是某块地址,这块地址不变,但这块地址上存放的内容可以变。指向常量的指针const int*p:主语在常量int上,const修饰的是常量,普通的指针,不过指向了这个常量。不能用*p来修改值......原创 2022-07-11 10:16:34 · 234 阅读 · 0 评论 -
C/C++开发进阶的学习路线
STL = Standard Template Library,即标准模板库。这是提高开发效率的极品工具。通过学习此阶段,应掌握泛型编程技巧,理解容器类在C++语言中的应用模式,以及熟练掌握全部STL类的使用方法。决定一个项目成败最重要的因素是项目总体的设计,通过本阶段的学习,可掌握面向对象编程中重要的一环,是编码前建模的技巧所在。单例模式;工厂模式;代理模式;迭代模式等,这些都是你要掌握的哦。这是所有编程语言中最应该学习的部分,程序组成的基础之一。顺序存储、链式存储、循环链表;双向链表、栈(顺序和链式)、转载 2022-07-08 15:55:17 · 599 阅读 · 0 评论 -
C++函数指针讲解
与数据项相似的是函数也有地址,一般情况下对用户来说没什么用,但是对于程序来说,用处比较大,例如:将另一个函数的地址作为一个函数的参数,这样第一个函数就能找到第二个函数并且运行它。虽然这种方式比起直接调用的方式比更加的笨拙,但是其允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。 函数名就是函数的地址,例如:函数get_sum(),该函数的地址是get_sum而不是get_sum(),get_sum()为函数的返回值。函数指针的声明:表明指定的函数返回类型、表明函数的特征标(参转载 2022-07-08 15:49:58 · 1094 阅读 · 0 评论 -
C/C++编译器中数组越界却不会报错崩溃
平时编码的话数组一般都用STL标准库的vector或map等,很少使用int[10]这种自己写的,今天偶然看到别人代码的奇怪bug,一直找不到原因,后来突然想到是不是数组越界没有报错导致?但又不敢肯定了,因为STL标准库越界直接就崩溃报错了,对于自己写的数组还是测试一下吧。......原创 2022-06-29 11:23:33 · 1481 阅读 · 0 评论 -
C++学习之回调函数
回调函数就是通过函数指针调用函数。如果把函数的指针或者地址作为参数传递给另一个参数,当这个指针被用来调用其所指向的函数时,那么这就是一个回调的过程,这个被回调的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或者条件发生时由另外的一方调用的,用于对该事件或者条件进行响应。回调函数就是在两个独立函数或者独立类通信的通道。(1) 同步回调:把函数b传递给函数a。执行a的时候,回调了b,a要一直等到b执行完才能继续执行;(2) 异步回调:把函数b传递给函数。............原创 2022-06-17 16:52:24 · 1949 阅读 · 1 评论 -
C++四种强制类型转换
C++ 对类型转换进行了分类,并新增了四个关键字来予以支持,它们分别是:1、static_caststatic_cast 是“静态转换”的意思,也就是在编译期间转换,转换失败的话会抛出一个编译错误。2、reinterpret_castreinterpret_cast 用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。转换时,执行的是逐个比特复制的操作。3、const_castconst_cast 运算符仅用于进行去除 const 属性的转换,它也是四个强转载 2022-06-14 15:42:21 · 4363 阅读 · 0 评论 -
c++17文件系统<filesystem>
C++17终于推出了文件系统处理模块,类似于Qt中的文件系统,易用性大大提高,原创 2022-06-14 14:03:28 · 3657 阅读 · 0 评论 -
生成GUID的两种方式
1、调用Win32API-CoCreateGuid函数;#include <objbase.h>std::string GenerateGUIDStr();std::string GuidToString(const GUID &guid); std::string CLib_Global::GuidToString(const GUID &guid){ char buf[64] = { 0 }; sprintf_s(buf, sizeof(buf), "{原创 2022-05-13 13:25:06 · 1827 阅读 · 0 评论 -
string 字符串小练习
1、将字符串中的空格或Tab键替换为"_",例如“ you are a good boy”转换为“ you_are_a_good_boy”// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>#include<string>#include<vector>using namespace std;int main(){ vector原创 2022-03-15 17:45:14 · 522 阅读 · 2 评论 -
获取文件大小(超过2G的文件)
1. 不超过2Gbool CUploadUtils::IsBigFile(std::string sName){ CString strName = sName.c_str(); std::ifstream iFile(sName, std::ios::binary); if (iFile.is_open() == false) { CString sMsg; sMsg.Format(_T("文件“%s”打开失败,错误码:0x%X"),strName, GetLastError());原创 2022-01-17 12:42:46 · 1036 阅读 · 0 评论 -
C++ 获取exe路径名称 路径分割函数 _splitpath_s()
可以对字符串路径进行分割:#include <stdio.h>#include <windows.h>#include <cstdlib> #include <iostream>using namespace std;int main() { char* path="C:\\服务程序\\MDTest\\地形\\tileset.json"; char drive[5]; char dir[100]; char fi原创 2021-11-10 14:16:54 · 1104 阅读 · 0 评论 -
比较有用的字符串编码转换类
StringUtil.htypedef wchar_t *BSTR;namespace StringUtils{ //Summary: 把字符串存入文件中 void WriteString(FILE* fp, const CString& sStr); //Summary: 从文件中读取WriteString保存的字符串,自动处理ANSI和UNICODE转换 bool ReadString(FILE* fp, CString& sStr); // Summary:原创 2021-10-09 15:44:47 · 137 阅读 · 0 评论 -
通用二进制文件的创建及读取
1、功能目的将获取的管道数据和管点数据(均包含属性)保存为二进制文件,方便后续使用时候读取;相比XML和json格式,数据量很大时二进制存储和读取速度较快。2、实现方式头文件.h// 管道几何数据与属性class CPipeData{public: CPipeData(); CPipeData(const CString& strObjId, const AcGePoint3d& startPnt, const AcGePoint3d& endPnt, const原创 2021-09-02 11:18:50 · 1163 阅读 · 0 评论 -
C++11 指针成员与拷贝构造(浅拷贝与深拷贝)
【1】浅拷贝一直以来,设计一个类,个人认为,最能体现水平的地方在于:类中含有指针成员变量。如下一个典型的浅拷贝示例:#include <iostream>using namespace std;class HasPtrMem{public: HasPtrMem() : d(new int(0)) {} ~HasPtrMem() { delete d; d = nullptr; } int* d;}转载 2021-04-22 23:20:31 · 1263 阅读 · 0 评论 -
区分LPCTSTR和LPTSTR和char *
LPSTR = char*LPCSTR = const char*LPTSTR:如果定义了UNICODE宏,那么LPTSTR = wchar_t否则LPTSTR = charLPCTSTR:如果定义了UNICODE宏,那么LPCTSTR = const wchar_t*,否则LPCSTR = const char*告诉你方法,"LP"前缀是历史遗留的,在Win32下就是 P ,代表指针的含义。"C"代表const"T"的含义就是如果定义了UNICODE,它就是宽字符版本,否则就是Ansi版原创 2020-10-28 13:36:05 · 466 阅读 · 0 评论 -
std::set使用
#include <iostream>#include <set>using namespace std;/*Student结构体*/struct Student { string name; int age; string sex;};/*“仿函数"。为Student set指定排序准则*/class SortCriterion {public: bool operator() (const Student& a, co原创 2020-07-21 23:29:31 · 763 阅读 · 0 评论 -
数量不定的模板参数 C++11
#include <iostream>#include<bitset>using namespace std;void print(){ cout << "The function is over!" << endl;}template <typename T,typename... Types>void print(const T& firstArg, const Types&... args){ cout原创 2020-07-18 23:07:36 · 643 阅读 · 0 评论 -
C++中 std::string的format()函数实现及string拷贝到char*字符串
C++中 std::string的format()函数实现及string拷贝到char*字符串原创 2020-05-31 00:09:27 · 7498 阅读 · 1 评论 -
常规C++类书写方法
1.头文件// 2010.05.14.Template.ZLY#pragma onceclass CMyClassImp{public: CMyClassImp(); ~CMyClassImp(); CString m_strName; // 姓名 int m_nAge; // 年龄 CString m_strAddress; // 家庭住址};class CMyClass{public: CMyClass(void); ~CMyClass(void); /原创 2020-05-14 15:44:53 · 3432 阅读 · 0 评论 -
iter_swap函数:交换2个迭代器的值
std::swap()函数有一个缺点:无法交换2个迭代器的值,一开始想要交换一个vector中的两个元素,我是这么写的:struck MyData{…………}std::vector<MyData> vecTemp;for(…………){ vecTemp赋值。。。。}vecTemp::iterator itorTemp = vecTemp.begin();if(……){ std::swap(itorTemp ,vecTemp.begin());} 但是发原创 2020-05-12 08:40:25 · 1258 阅读 · 0 评论 -
关于const_cast的一些说明
const_cast转换符是用来移除变量的const或volatile限定符。1、用const_cast来去除const限定 对于const变量,我们不能修改它的值,这是这个限定符最直接的表现。但是我们就是想违背它的限定希望修改其内容怎么办呢?下边的代码显然是达不到目的的:const int constant = 10;int modifier = constant; 因为对modifier的修改并不会影响到constant,这暗示了一点:const_cast转换符也不该用在对象数据上原创 2020-05-08 22:11:18 · 1129 阅读 · 2 评论 -
char*指针、ch数组、int*指针以及int数组的对比
以下代码分别输出了不同情况下的值:int main(){ char a[] = "hello"; char* b = a; char* c = b; cout << "char指针输出: " << b << " " << c << " " << *b << " " << *c <...原创 2020-04-20 21:46:06 · 474 阅读 · 0 评论 -
C++的开源JSON开发包 RapidJSON简单使用
1、简介RapidJSON 是一个 C++ 的 JSON 解析器及生成器。它的灵感来自 RapidXml。RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。RapidJSON 快。它的性能可与 strlen() 相比。可支持 SSE2/SSE4.2 加速。RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至不依赖...原创 2020-04-19 23:04:08 · 1270 阅读 · 1 评论 -
winAPI读写ini文件
winAPI读入写入ini文件void GetBlockConfigParam(unsigned int& nTime,unsigned int& nNum){ const CString sIniFileName = _T("C:\\Config.ini"); // 判断文件是否存在,不存在的话创建 FILE* pFile = NULL; if(_tfopen_s(...原创 2020-04-15 15:36:55 · 369 阅读 · 0 评论 -
c++基础注意事项
1、头文件中不应该使用using声明,因为头文件的内容会拷贝到所有引用他的文件中去,可能在不经意间造成冲突;2、原创 2020-04-09 22:11:03 · 454 阅读 · 0 评论 -
C/C++文件读写操作总结:FILE*、fstream、windowsAPI
在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。一、流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio.h中定义如下:typedef struct {int level;unsigned flags;char fd;unsigned char hold;int bsize;unsigned char _...原创 2020-03-05 13:29:40 · 2371 阅读 · 1 评论 -
C语言中动态分配数组
很多人在编写C语言代码的时候很少使用动态数组,不管什么情况下通通使用静态数组的方法来解决,在当初学习C语言的时候我就是一个典型的例子,但是现在发现这是一个相当不好的习惯,甚至可能导致编写的程序出现一些致命的错误。尤其对于搞嵌入式的人来所,嵌入式系统的内存是宝贵的,内存是否高效率的使用往往意味着嵌入式设备是否高质量和高性能,所以高效的使用内存对我们来说是很重要的。那么我们在自己编写C语言代码的时...原创 2020-01-20 09:37:15 · 440 阅读 · 0 评论 -
C++处理图片方法之GDI+
最近要做一个C++简单的jpg处理的函数功能,由于用在服务端,不能引入MFC的东西,于是就用上了GDI+,用它的做一些基本的图像处理和绘图基本上还是很简单的,毕竟是微软的亲儿子。如果你使用的是VC++ 6.0你需要去网上下载一个GDI+,如果是VS2008及以上就不需要了,VS2005没有用过,大概也不需要另...原创 2019-10-15 17:30:24 · 1104 阅读 · 0 评论 -
std::vector中swap()函数使用解析以及去重复操作
1、常用方式,交换vector内部的两个元素int main(int argc, char* argv[]){std::vector<string> sentence;sentence.push_back("hello");sentence.push_back("how");sentence.push_back("are");sentence.push_back("you...原创 2019-08-26 09:59:34 · 35483 阅读 · 5 评论 -
C/C++语言中 指针复制与指针赋值的作用
int *a,*b;//声明两个指针变量a=b; //指针复制:此语句使a指向的地址与b指向的地址相同,它们都指向同一内存区域。*a=*b ; //指针赋值:此语句使a指向的地址(内存位置)的内容与b指向地址(内存位置)的内容相同,但a与b指向的地址不一定相同&a=&b ; //这个一般比较少用,使指针a本身的内容与指针b本身的内容相同总结指针的用处:用于指向与其类型相同的......原创 2019-08-02 09:15:59 · 13848 阅读 · 1 评论