
C++
C++开发技术
tony_jx
软件从业者
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++使用相对路径文件
C++项目中用到的资源文件,如使用相对路径,按照如下方式。编译器中使用相对路径相对路径以源码文件路径为依据。可执行文件使用相对路径相对路径以可执行文件路径为依据。关联编译器和可执行文件项目->属性->命令:xcopy /e /f src dst...原创 2021-09-14 15:31:24 · 1663 阅读 · 0 评论 -
Qt枚举类型获取对应数字和字符串-3
前面已经介绍过Qt中使用enum返回对应数字和字符串的示例,链接如下:示例1:Qt枚举类型获取对应数字和字符串_tony_xj的博客-CSDN博客 示例2:Qt枚举类型获取对应数字和字符串-2_tony_xj的博客-CSDN博客当上述示例存在问题, 说明如下:定义对象的数字和字符串是分开的,极容易出错, 没有体现出封装的特性. 上述问题也是由C++ enum造成的.所以我们推出了示例3,使用类来代替enum,大大提升封装性和扩展性.season2.h#ifndef SEASO..原创 2022-04-06 11:20:35 · 904 阅读 · 0 评论 -
Qt枚举类型获取对应数字和字符串-2
基础使用可以参照示例1链接:Qt枚举类型获取对应数字和字符串示例1中使用了静态初始化函数(static void initial),针对方法较多的情况下,都需要增加判断逻辑,引起程序复杂性.示例2优化点业务逻辑写到.h中. 增加int类型方法调用. 定义并初始化,减少逻辑判断.season.h#ifndef SEASON_H#define SEASON_H#include <QString>#include <QStringList>class.原创 2022-04-06 11:04:42 · 1073 阅读 · 0 评论 -
C++/Qt字符串转换
QString->QByteArrayQByteArray QString::toLocal8Bit();QByteArray->QStringQString(QByteArray byteArray);QString->std::stringstd::string QString::toStdString();std::string->QStringQString QString::fromStdString(const std::string &st.原创 2022-03-22 17:41:54 · 508 阅读 · 0 评论 -
C++/C判断Windows,Mac和Linux平台宏定义
C++/C判断Windows,Mac和Linux平台宏定义#ifdef _WIN32 //define something for Windows (32-bit and 64-bit, this part is common) #ifdef _WIN64 //define something for Windows (64-bit only) #else //define something for Windows (32-bit only) #end原创 2022-01-08 20:06:48 · 9722 阅读 · 3 评论 -
C++继承 vs. java继承特性比较
C++继承构造和析构顺序构造函数:先调用父类的构造函数,再调用成员变量的构造函数,最后调用自己的构造函数。 析构函数:先调用自己的析构函数,再调用成员变量的析构函数,最后调用父类的析构函数。类型兼容原则子类对象可以当做父类对象来使用。 子类对象可以直接赋值给父类对象。 子类对象可以直接初始化父类对象。 父类指针可以直接指向子类对象。 父类引用可以直接引用子类对象。 有个形象的说法叫“切片”或者“切割”,寓意把派生类中父类那部分切来赋值过去。 如果父类的成员和子类的成员属性名称相同原创 2021-12-06 14:08:47 · 785 阅读 · 0 评论 -
VisualStudio/Qt使用VLD检查内存泄露
下载VLD链接地址:Visual Leak Detector | Enhanced Memory Leak Detection for Visual C++安装VLD添加环境变量可以直接使用不添加环境变量,需要手动引入。配置VLD链接地址:VisualStudio如何导入lib库和.h文件_quietbxj的博客-CSDN博客使用VLD#include "vld.h"int main(){ int *a = new int[100]; return 0;.原创 2021-11-15 14:47:44 · 649 阅读 · 0 评论 -
C++编译阶段检查版本信息
C++编译阶段检查版本信息,程序示例如下:#define X_VERSION_MAJOR 1#define X_VERSION_MINOR 1#define X_VERSION_PATCH 2//版本检查//大版本.小版本.补丁#if (X_VERSION_MAJOR != 1) || (X_VERSION_MINOR != 1) || (X_VERSION_PATCH != 1)#pragma message("预处理信息") //提示信息#error x.h and x.c hav原创 2021-10-19 16:36:23 · 347 阅读 · 0 评论 -
C++ std::map使用
程序示例#include <iostream>#include <map>using namespace std;int main(){ map<char, int> mymap; //使用map mymap.insert(pair<char, int>('a', 1)); mymap.insert(pair<char, int>('b', 2)); mymap.insert(pair<char, int>('原创 2021-10-15 17:06:01 · 265 阅读 · 0 评论 -
C++ sizeof 空类大小
程序示例#include <iostream>using namespace std;class A {public: A(){}};int main(){ A a; cout << "sizeof(A obj)=" << sizeof(a) << endl; //1 cout << "sizeof(A)=" << sizeof(A) << endl; //1 A *a1 = new A原创 2021-10-15 15:32:53 · 267 阅读 · 0 评论 -
c++ sleep函数(windows平台)
c++ sleep函数(windows平台)#include <Windows.h>#include <iostream>#include <ctime>using namespace std;int main(){ time_t start = time(0); char ch[30]; ctime_s(ch, 30, &start); cout << "start: " << ch << endl原创 2021-09-29 16:06:41 · 896 阅读 · 0 评论 -
C++程序检查内存泄漏(VS2017)
C++程序检查内存泄漏(VS2017)//添加头文件#include <crtdbg.h>int main(int argc, char* argv[]){ //开始检查-需在debug环境中 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); int *p = new int(); return 0;}//程序运行结束,会在输出窗口显示内存泄露情况...原创 2021-09-13 19:37:20 · 543 阅读 · 0 评论 -
C++回调函数
C++回调函数实例#include <stdio.h>//函数中的context上下文,很重要到参数,规范的写法都会加上//函数原型==函数指针//height: 参数//context: 上下文typedef void(*heightFun)(double height, void *context);//回调函数//fun: 函数指针//context: 上下文void registerHeight(heightFun fun, void* context){原创 2021-09-13 19:37:41 · 168 阅读 · 0 评论 -
C++单例类如何析构
C++单例类特点有一个指唯一实例的静态指针m_pInstance,并且是私有的。 有一个公有的函数,可以获取这个唯一的实例,并在需要的时候创建该实例。 构造函数/拷贝构造是私有的,这样就不能从别处创建该类的实例。问题:m_pInstance指向的空间什么时候释放呢? 这个实例的析构操作什么时候执行?网络上提供的解决方案如下:链接1:https://www.cnblogs.com/wxxweb/archive/2011/04/15/2017088.html 链接2:https://bl原创 2021-07-26 18:31:04 · 2283 阅读 · 0 评论 -
C++总结2
标准库字符串string 其实并不是一个“真正的类型”,而是模板类 basic_string 的特化形式: using string = std::basic_string<char>; // string其实是一个类型别名 basic_string用来支持不同字符类型。 字符编码和国际化的问题实在是太复杂了, C++ 一直没有提供处理编码的配套工具。 string 是一个功能比较齐全的字符串类,提供了字符操作的所有方法;也提供了类似容器的操作。 但我们还是应该将string作原创 2021-07-10 16:57:41 · 226 阅读 · 0 评论 -
C++总结1
编程格言任何人都能写出机器能看懂的代码,但只有优秀的程序员才能写出人能看懂的代码。 有两种写程序的方式:一种是把代码写得非常复杂,以至于“看不出明显的错误”;另一种是把代码写得非常简单,以至于“明显看不出错误”。 “把正确的代码改快速”,要比“把快速的代码改正确”,容易得太多。 警示一个 Bug 在越早的阶段发现并解决,它的价值就越高;一个 Bug 在越晚的阶段发现并解决,它的成本就越高。概论开发环境GCC4.6或者4.8才支持C++11标准。 CentOS稳定.原创 2021-07-10 16:55:05 · 131 阅读 · 1 评论 -
C编码规范
基于OpenResty® C 代码风格指南链接:http://openresty.org/cn/c-coding-style-guide.html原创 2021-07-06 20:24:25 · 110 阅读 · 0 评论 -
Windows Socket Api使用
Socket程序基本结构#define WIN32_LEAN_AND_MEAN#define _WINSOCK_DEPRECATED_NO_WARNINGS#include <windows.h>#include <WinSock2.h>#include <iostream>#pragma comment(lib, "ws2_32.lib")using namespace std;int main(){ //设置版本,开启Socket W原创 2021-07-04 15:29:16 · 448 阅读 · 1 评论 -
Socket使用流程
流程图如下。说明Socket客户端可以看作是文件读写的过程。 Socket服务端可以看作是循环监听事件的过程。 这样理解通信的流程会很简单。原创 2021-07-04 13:53:54 · 266 阅读 · 0 评论 -
VisualStudio中指针变量如何在debug中查看其值
VisualStudio在调试时,指针变量只会显示其地址,其中的数据值我们需要特殊处理才可以看到。程序如下#include <stdio.h>int main(){ //定义变量 int arr[] = { 1,2,3,4,5 }; int* pArr = arr; int i = 10; int* pI = &i; printf("i=%d\n", i); //这里打断点 return 0;}在断点监视变量时,只能看到指针的地址,如下图。原创 2021-07-04 13:46:00 · 4011 阅读 · 0 评论 -
VisualStudio定义环境宏变量
在工程属性中增加宏定义,可以方便在程序中直接使用。原创 2021-07-04 13:21:40 · 485 阅读 · 0 评论 -
Visual Studio配置工程输出目录
Visual Studio工程默认生成路径会在工程目录下,这样会对程序源码造成很大的干扰,为了保证源码管理整洁,建议开发者手动设置一下生成的目录,步骤如下:打开工程属性设置项配置项$(SolutionDir)../bin/$(Platform)/$(Configuration)\$(SolutionDir)../temp/$(Platform)/$(Configuration)/$(ProjectName)\说明$(xxx):一般表示VS自定义的环境变量。链接:https:/原创 2021-07-04 13:14:25 · 700 阅读 · 0 评论 -
Android Studio ndk
ndk是什么jni是java和C++交互到接口。 ndk是利用jni,将C++编译成so库,并将库和Apk进行打包的工具。 ndk本质是使用jni,但有提供了便于操作到打包工具。Android Studio编写C++,增加代码提示添加ndk插件java调用C代码和C代码调用java中到methodTestJni.javapublic class TestJni { private static final String TAG = "TestJni"; //原创 2021-06-27 15:17:42 · 241 阅读 · 0 评论 -
win32桌面程序在控制台中输出信息
Win32桌面程序直接显示界面,不能在控制台中输出调试信息。可以通过如下2种方式来在控制台中输出调试日志。方法1原创 2021-06-12 14:36:51 · 1410 阅读 · 0 评论 -
C++序列化
链接:https://www.cnblogs.com/lanxuezaipiao/p/3703988.html原创 2021-06-04 09:02:15 · 140 阅读 · 0 评论 -
Visual Studio切换控制台和窗口应用
设置图示说明设置路径:项目——项目属性——配置属性——链接器——系统——(右边)子系统原创 2021-05-30 14:35:55 · 2882 阅读 · 2 评论 -
C++拷贝构造函数
拷贝构造函数格式: Point(const Point &p);使用const如果你定义拷贝构造函数时遇到这样的错误:no copy constructor available or copy constructor is declared 'explicit'意味着你的拷贝构造函数的参数不是const 。不使用explicit而且拷贝构造函数是不能加explicit关键字的!类型相同的对象才能称为“拷贝”,既然类型相同,那就不存在什么隐式转换的问题!只有构造函数的参数类型..原创 2021-05-29 08:45:28 · 230 阅读 · 0 评论 -
Win32开发7--线程3
线程事件解决程序之间通知的问题. 线程之间协调来处理.程序示例#include <Windows.h>#include <stdio.h>HANDLE gEvent; //事件//执行任务事件DWORD WINAPI testProc(LPVOID pParam){ while (1) { WaitForSingleObject(gEvent, INFINITE); ResetEvent(gEvent); printf("*****原创 2021-04-20 19:55:37 · 92 阅读 · 0 评论 -
Win32开发6-线程2
线程不安全多个线程操作同一个变量,会有线程不安全的问题,程序示例#include <Windows.h>#include <stdio.h>int gNum = 0;DWORD WINAPI testProc(LPVOID pParam){ for (int i = 0; i < 10000; i++) { gNum++; //这样操作线程不安全 } return 0;}int main(){原创 2021-04-20 19:54:54 · 92 阅读 · 0 评论 -
Win32开发5-线程1
概念Windows线程是可以执行的代码实例,系统以线程作为调度单位,一个程序可以由多个线程,实现多任务的处理. Windows线程的特点 线程都有一个id. 每个线程都有自己的内存栈 同一进程中的线程使用同一个地址空间. 线程的调度 CPU将执行时间划分成时间片,根据时间片执行不同的线程,从宏观角度看是并行的,从微观角度看是串行的. 创建线程函数程序示例#include <Windows.h>#include <stdio.h>DWOR原创 2021-04-18 18:09:52 · 187 阅读 · 0 评论 -
Win32开发4-窗口类
概念窗口类是包含了窗口的各种参数信息的数据结构. 每个窗口都有窗口类,基于窗口类创建窗口. 每个窗口都有一个名称,使用前必须注册到系统.分类系统窗口类 系统已经定义好的窗口类,所有应用都可以直接使用. 不需要注册,直接使用窗口类即可(系统已经提前注册好了). 如按钮BUTTON,编辑框EDIT等 应用程序全局窗口类 由用户自己定义,当前应用程序的所有模块可以使用. 应用程序局部窗口类(较少使用) 由用户自己定义,当前应用程序中仅本模块使用. 使用系统窗口程序示例原创 2021-04-20 19:55:26 · 249 阅读 · 0 评论 -
Win32开发3-编码
发展历史ASC:7位来表示一个字符(纯英文)-节省资源 ASCII:8位来表示一个字符(兼容特殊字符) DBCS:英文一个字节, 中文两个字节(会造成解析失败) UNICODE:万国码,没有解析问题.DBCS和UNICODE码初始化时需要指定L char的方法和wchar_t的方法肯定不相同. 凡是支持char的方法,一定有支持wchar_t的相似方法.程序示例#include <Windows.h>#include <stdio.h>void原创 2021-04-18 16:15:14 · 165 阅读 · 0 评论 -
C++使用动态库(dll)
动态库特点运行时独立存在 源码不会链接到执行程序 使用时加载,动态加载与静态库比较由于静态库是将代码嵌入到使用程序中,多个程序使用时,会有多份代码,所以代码体积会增大;动态库只需要存在一份,其它程序通过函数地址使用,所以代码体积小. 静态库发生变化后,新的代码需要重新嵌入到执行程序中,进行编译;动态库发生变化,如果库中的函数定义(或地址)未变化,其它使用dll的程序不要重新链接.动态库创建创建动态库项目 添加库程序 库程序导出 声明式导出 _declspec(dllexport原创 2021-04-17 13:45:21 · 2551 阅读 · 0 评论 -
Win32开发2-窗口简介
窗口创建过程定义WinMain函数. 定义窗口处理函数(自定义函数,系统调用处理消息). 注册窗口类(向操作系统写入一些数据). 创建窗口(内存中创建窗口). 显示窗口(绘制窗口的图像). 消息循环(获取/派发消息). 消息处理.程序示例以下程序运行会显示一个窗口. 但关闭窗口后,程序不会停止运行,必要时需要在任务管理中强制停止. 本例仅仅按照窗口的创建流程来实现.#include <windows.h>//窗口处理函数LRESULT CALLBACK Wnd原创 2021-04-17 00:12:22 · 105 阅读 · 0 评论 -
C++使用静态库
静态库特点没有入口文件 静态库会被链接到调用程序中 目标文件中会保存一份静态库文件编写步骤创建静态库项目 编写库程序 调用库函数 添加依赖:#pragma comment(lib, "../Debug/CppLib.lib")C++调用C++静态库库文件源码--CPPLib.cppint add(int a, int b){ return a + b;}int sub(int a, int b){ return a - b;}C++调用源码--UseLib原创 2021-04-15 20:16:07 · 2092 阅读 · 0 评论 -
Win32开发1-简介
Win32程序分类控制台程序-Console DOS程序,本身没有窗口,通过Windows DOS窗口执行. 窗口程序 拥有自己的窗口 库程序 存放代码和数据的程序 静态库程序:扩展名lib,编译链接时,将代码放到执行文件中. 动态库程序:扩展名dll,在执行文件时才会获取代码. 入口函数对比控制台程序--main 窗口程序--WinMain 动态库程序--DllMain,但不能独立运行. 静态库程序--无编译工具cl.exe将源代码编译成目标文件.obj原创 2021-04-11 23:31:26 · 184 阅读 · 0 评论 -
Makefile入门系列1
C++编译执行过程C/C++ -> exe ?-E 预处理: 把.h .c展开成一个文件宏定义直接替换 -> .i gcc -E hello.c -o hello.i -S 汇编: .i生成一个汇编代码文件 .S gcc -S hello.i -o hello.S -c 编译: .S生成一个 .o .obj gcc -c hello.S -o hello.o -o 链接: .o链接生成 .exe .elf(linux) gcc hello.o -o hello原创 2021-03-27 10:39:59 · 136 阅读 · 0 评论 -
NDK是什么
NDK全称:Native Development Kit,即本地开发工具包. android的SDK加上Native(原生),支持使用C/C++之类的原生代码语言进行开发.NDK学习路径C/C++学习. jni开发. Gradle和CMake编译工具相关. clang编译的参数配置.使用场景计算密集型. 音视频编解码....原创 2021-03-26 09:54:54 · 2398 阅读 · 0 评论 -
CMake和其它编译工具对比
CMake和其它编译工具对比GCC由GUN开发的编译器,支持C/C++,Java等语言. 项目简单时,可以使用gcc/g++来进行编译. 项目复杂时,只使用gcc来进行编译会变得非常复杂.MakefileMakefile是有条理的gcc编译命令文件. 利用make工具执行Makefile文件,来达到编译的目的. 程序简单时,可以使用Makefile. 程序复杂时,有局限性.AutotoolsAutotools是一个工具集,有很大的灵活性,对用户较为友好. 开发步原创 2021-03-26 09:44:25 · 1064 阅读 · 0 评论 -
C语言指针
前言C/C++是偏底层的语言,因为它可以直接操作内存. 存储时,内存是一块一块的,每一块都有特定的编号. 这个编号可以理解为指针.变量存储int main(){ int x = 10; int y = 20;/** 说明:* 1.去酒店订了两个房间,门牌号是px,py* 2.让10进入px,让20进入py.* 3.门牌号px,py就是变量的地址.* 4.x和y是具体的房间,px和py是其门牌号,10和20通过门牌号进入房间* * 两个操作:* 1.int原创 2021-03-24 09:52:27 · 93 阅读 · 0 评论