
C++
Thomas会写字
艰苦朴素
展开
-
MFC 自定义消息函数
【代码】MFC 自定义消息函数。原创 2022-12-26 11:11:54 · 287 阅读 · 0 评论 -
MultiByteToWideChar 和 WideCharToMultiByte 用法详解
https://www.cnblogs.com/ranjiewen/p/5770639.html转载 2021-07-29 06:54:46 · 1336 阅读 · 0 评论 -
动态内存分配、malloc与new的区别
内存分配先看内存的分布状况一个由C/C++编译的程序占用的内存分为以下几个部分: 栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束 时可能由OS回收 。分配方式类似于链表。 全局区(静态区)(static)—存放全局变量、静态数据、常量。程序结束后由系统释放。 文字常量区 —常量字符串就是放在这里的。 程序...转载 2021-07-26 15:42:08 · 490 阅读 · 0 评论 -
C++读写txt
1、File*(1) 写入txtvoid WriteTXT(){ std::string filepath; FILE* file = fopen(filepath.c_str(), "wt+"); if (file) { std::string str = "test"; std::stringstream ss; ss << "write txt " << str;转载 2021-07-17 16:14:45 · 658 阅读 · 0 评论 -
MFC 点击其他进程的按钮,编辑Edit对话框值
跨进程控制的基本思路:MFC消息机制使用函数 PostMessage(阻塞) / SendMessage(非阻塞)点击按钮其他进程主窗口指针pWnd->PostMessage(WM_COMMAND, MAKEWPARAM(ID, BN_CLICKED), (LPARAM)pDlg->hWndLoad);这里最后一个参数可以设置为NULL,但是有些对话框会设置一些安全信息来验证消息。设置Edit对话框内容::SendMessage(Edit控件hWnd, WM_SETTEX原创 2021-01-29 16:39:08 · 553 阅读 · 0 评论 -
MFC 获取窗口句柄
1、使用FindWindow函数获取窗口句柄示例:使用FindWindow函数获取窗口句柄,然后获得窗口大小和标题,并且移动窗口到指定位置。#include <Windows.h>#include <stdio.h>#include <string.h>#include <iostream.h> int main(int argc, char* argv[]){ //根据窗口名获取QQ游戏登录窗口句柄 HWND hq=FindWind转载 2021-01-29 09:55:45 · 2625 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (十三)线程的信号量、锁、私有数据
回顾:线程与进程 1. 进程由于资源独立,进程的主要关注是解决资源共享 2. 线程先天是数据共享,线程主要关注共享数据脏 1.互斥量(线程内) 读写锁 3. 信号/条件量调度(线程之间)信号量一、 线程的信号量定义信号量 sem_t 初始化信号量 sem_init 操作信号量 sem_post sem_wait 释放信号量 sem_d...原创 2020-12-25 05:53:59 · 274 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (十二)多线程概念、互斥锁、多线程同步、信号、条件量、信号量
一、 多线程 1. 了解多线程解决多任务实现。历史上Unix服务器不支持多线程Unix/Linux上实现多线程有两种方式:1)内核支持多线程2)使用进程的编程技巧封装进程实现多线程:轻量级多线程(现在的)多线程的库:libpthread.so -lpthreadpthread.h 2. 创建多线程2.1.代码?回调函数2.2.线程ID?pthread_t2.3.运行线程?pthread_createint pthread_cr...原创 2020-12-22 17:31:17 · 455 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (十一)select、TCP编程模型、Socket选项、OOB、HTTP协议
回顾:多进程的问题:数据共享。多进程的问题:进程的上下文环境(context)文件描述符号是整数以及对应上下文环境多进程的问题:上下文环境共享SELECT TCP服务器编程模式select函数int select(int fds, //建议是监控的文件描述符号的最大值+1fd_set *readfds, //读文件描述符号集合//该参数既是输入,也是输出//输入:被监控的描述符号//输出:有数据的描述符号fd_set *writefds, //写描述符.原创 2020-10-28 09:44:35 · 306 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (十)TCP编程模型、TCP通信特点、TCP编程模型、TCP多进程服务器
一、 TCP的编程模型回顾:UDP模型的UML图TCP模型的UML图案例1:TCP的服务器(在案例中使用浏览器作为客户程序)socket建立服务器的文件描述符号缓冲bind把IP地址与端口设置到文件描述符号中listen负责根据客户连接的不同IP与端口,负责生成对应的文件描述符号及其信息accept一旦listen有新的描述符号产生就返回,否则阻塞。案例2:每个客户的代理描述符号的通信tcp_Ser...原创 2020-10-28 09:42:16 · 225 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (九)信号量同步、socket网络编程基础、TCP、UDP
一、信号量(同步) 1. 回顾:一个进程控制另外一个进程.逻辑变量+pause/sleep+信号 2. 信号量(semaphore)信号灯三个数据:红灯/绿灯/黄灯60 90 10信号量是共享内存整数数组,根据需要定义指定的数组长度信号量就是根据数组中的值,决定阻塞还是解除阻塞 3. 编程3.1 创建或者得到信号量 semget3.2 初始化信号量中指定下标的值 semctl3.3 根据信号量阻塞或者解除阻塞 semop3.4 删除信号量 s...原创 2020-10-27 17:12:40 · 386 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (八)共享内存、消息队列、Socket、Socket编程模型
Day09 信号量同步、socket网络编程基础、TCP、UDP信号量(同步)回顾:一个进程控制另外一个进程.逻辑变量+pause/sleep+信号信号量(semaphore)信号灯三个数据:红灯/绿灯/黄灯60 90 10信号量是共享内存整数数组,根据需要定义指定的数组长度信号量就是根据数组中的值,决定阻塞还是解除阻塞编程3.1 创建或者得到信号量 semget3.2 初始化信号量中指定下标的值 semctl3.3 根据信号量阻塞或者解除阻塞 se...原创 2020-10-27 16:47:39 · 437 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (七)信号、sigqueue、sigaction、IPC、管道、匿名管道
回顾:信号的作用 理解信号:软中断可靠与不可靠信号kill -l信号发送与注册kill/raisealarmsetitimersignal信号的屏蔽sigprocmasksigemptysetsigfillset信号屏蔽的切换sigpendingsigsuspend = pause + 指定屏蔽信号pause与sigsuspend都会被信号中断。中断的是pause与sigsuspen函数,不是进程中其他代码sigsuspend放在sigpro原创 2020-10-27 15:28:18 · 351 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (六)进程控制、信号、定时器、信号操作、信号屏蔽
问题解答:exit(状态码)返回状态码有什么意义?返回值被系统得到.系统根据状态码进行日志记录.返回值被调用者得到:system/wait.程序会根据返回状态码进行对应处理。exit(状态码)=main函数中的return 状态码;状态码的第二个字节才是exit()的返回值或者return值。进程的基本控制进程的常见控制函数1.1 为什么需要控制进程?1.2 pause/sleep/usleep(精确到微秒的sleep)1.3 atexit on_exit...原创 2020-09-19 20:31:44 · 276 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (五)目录、进程、system、popen2、exec、父子进程、fork
IO与文件目录管理pread = lseek + readpread读取以后不改变读写位置mmap映射:/proc/${pid}/mem 无法映射IO的有效用户与实际用户默认情况:实际用户与有效用户一直。实际用户:执行用户有效用户:权限用户uid_t getuid()uid_t geteuid()目录相关函数chdir 切换目录mkdir 创建目录rmdir 删除目录unlink 删除文件umask ...原创 2020-09-18 19:57:12 · 420 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (四)文件映射、文件描述符、curses
IO与文件映射IO的共享与效率read与write其中数据缓冲的大小读取数据的缓冲:getpagesize。一般用它的返回值大小设置为缓冲大小就可以,也可以为一个页大小。定位与定位读取(随机读取)read与write在操作的时候,自动移动读取位置.lseek改变读取位置.pread/pwrite在指定位置读写。ssize_t pread(intfd, void *buf, size_tcount, off_toffset);ssize_t pwrite(intfd, const原创 2020-09-18 17:54:09 · 505 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (三)makefile、IO、read、write
一、make与makefile回顾:目标的语法目标名:依赖目标@命令@命令make的命令行使用make -f make脚本文件 目标名目标的划分目标依赖默认规则:3.1 不指定目标,执行第一个目标3.2 不指定make文件,默认文件是makefile(无拓展名) Makefile(无拓展名)makefile优先目标的调用规则:(make把目标当作文件)make执行目标:搜索与目标相同的文件,如果文件存在,则判定日期:日期最新,则停止执行,输出...原创 2020-09-18 11:30:35 · 322 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (二)映射虚拟内存、gcc、静态库、动态库、make
回顾: brk/sbrk int brk(void *p); void *sbrk(int); 维护一个位置。brk/sbrk改变这个位置 brk改变绝对位置。 sbrk相对改变位置。补充:全新的类型。 永远记住:c的基本类型就:整数(1字节,2字节,4字节),小数(4字节,8字节) unsigned signed 所有全新类型都是使用typedef重新定义。学会找到新的类型的C的原型。 类型重定义的好处...原创 2020-07-21 22:54:35 · 353 阅读 · 0 评论 -
C++学习:第六章Linux高级编程 - (一)课程介绍、内存结构、堆结构、内存分配函数、函数空间分配、虚拟内存
一、约定1. 作业完成.2. 50-200 lines codes.二、课程体系1. 语言 C C++2. 算法 算法 数据结构3. 基础(系统核心(Kernel)编程) Linux/Unix Window MacOSX ...原创 2020-01-01 06:55:22 · 352 阅读 · 2 评论 -
C++学习:第五章模板、STL - (六)特殊容器、迭代器
特殊容器:stack queue priority_queue没有迭代器 Push(element) pop() enpty() size() Stakc: top() Queue: front() back() Priority_queue(): top() 排序:堆调整,只保证最大的在最前,其余不保证Priority_queue#include <...原创 2019-10-25 22:34:10 · 187 阅读 · 0 评论 -
C++学习:第五章模板、STL - (五)关联式容器、map、multimap
关联式容器的共性:set<Key> multiset<Key> map<Key, Val> multimap<Key, Val>关联式容器都是用二叉查找树来实现的,都会自动依据关键值排序 查找:find(key) 返回指向结果的迭代器,失败返回.end() 统计:conunt(key) 统计,关键字等于元素的个数 删除:erase(k...原创 2019-10-25 22:28:22 · 215 阅读 · 0 评论 -
C++学习:第五章模板、STL - (四)序列式容器、vector、list、deque
序列式容器的共性:vector deque list置顶元素个数和初始值(初始值默认为零初始化) 插入:insert(pos, n, element) insert(pos, pos_beg, pos_end) 赋值:assign(n, element) assign(pos_beg, pos_end) 调整:resize(n, element = 零初始化) 首尾:fron...原创 2019-10-25 22:23:16 · 240 阅读 · 0 评论 -
C++学习:第五章模板、STL - (三)STL、容器、序列
容器简单介绍基本概念STL = Standard Template Library类模板,称为“容器”,container函数模板,称为“通用算法”,algorithmvector deque list set/map multiset/multimap构造器的共性:构造函数:无参构造、拷贝、区间构造(两个迭代器表示的两个位置)、析构 迭代器相关函数...原创 2019-10-25 22:03:55 · 125 阅读 · 0 评论 -
C++学习:第五章模板、STL - (二)函数模板、Pair、autoptr
函数模板编译器可以根据实参去猜测形参类型函数模板不支持模板形参的默认值#include <iostream>#include <string>#include <algorithm>using namespace std;template <typename T>class Type{public: static str...原创 2019-06-18 01:24:44 · 231 阅读 · 0 评论 -
C++学习:第五章模板、STL - (一)模板概念、类模板
类模板类模板:Template <typename T>声明模板T只对下面一个类有效,因此函数的声明与实现必须在类中完成。Stack<string> s;类的调用把模板的未定类型确定下来,成为模板的实例化。#include <iostream>#include <string>using namespace std;...原创 2019-06-18 01:18:26 · 172 阅读 · 0 评论 -
C++学习:第四章数据结构和算法 - (五)算法基础、二分法查找
示例代码#include <iostream>#include <string>#include <ctime>#include <algorithm>//这个可以省略,但是安全起见要写上using namespace std;class Person{ string name; int age; string addr;p...原创 2019-06-18 00:24:25 · 148 阅读 · 0 评论 -
C++学习:第四章数据结构和算法 - (四)二叉树
二叉树代码#include <iostream>using namespace std;typedef int T;class bst{ struct Node{ T data; Node* L; Node* R; Node(const T& d = T(), Node* l = NULL, Node* r = NULL):data(d)...原创 2019-06-18 00:18:22 · 170 阅读 · 0 评论 -
C++学习:第四章数据结构和算法 - (三)链表、栈、队列
链表代码整理List.h#include <iostream>using namespace std;#ifndef LIST_H#define LIST_H 1 //这个 1 可有可无class List{typedef int T;struct Node{ int data; Node* next; Node(const T& d...原创 2019-06-18 00:17:02 · 221 阅读 · 0 评论 -
C++学习:第四章数据结构和算法 - (二)链表
代码#include <iostream>using namespace std;class List{ typedef int T; struct Node{ int data; Node* next; //这种初始化成为0初始化,具有通用性 Node(const T& data = T(), Node* next = NULL) ...原创 2019-06-18 00:11:27 · 156 阅读 · 0 评论 -
C++学习:第四章数据结构和算法 - (一)数据结构介绍、节点
节点链表的每个单元成为节点节点:值,下个节点的地址#include <iostream>using namespace std;struct Node{ int data; Node* next; Node(const int& d, Node* next = NULL):data(d),next(next){} operator int(){ret...原创 2019-06-18 00:09:40 · 241 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (十四)格式化输出、异常
格式化输出:cout.width(10),输出宽度10等效写法:cout << setw(10) << 123; //需头文件#include<iomanip>无论哪种写法,都是只对后面一个输出有效.是用来输出八进制和十六进制常量的前缀,八进制的前缀是0,十六进制常量的前缀是0x;cout << showbase <&l...原创 2019-02-11 10:34:41 · 250 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (十三)File、IO
两个方法 fin.read(内存地址 char*,字节数);注意这里是char* 需要做类型转换,reinterpret_cast<char*>(…..);fout.write(内存地址 char*,字节数);在C语言中,fread(内存地址,单位大小,总个数,文件)和fwrite是将数据在文件与内存中间移动处理,对应C++的为fin.read(内存地址 注意这...原创 2019-02-11 10:33:02 · 295 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (十二)File、IO
C++的几种输出cout 有缓冲、可重定向cerr 无缓冲、不可重定向clog 无缓冲、不可重定向(理论上是有缓冲的)输出刷新输出缓冲遇到换行、有输入、满、程序结束、flush会刷新几个输入输出函数o.put() 原样输出,含空白字符i.get() 原样输入,含空白字符i.getline() 正行输入i.ignore() ...原创 2019-02-11 09:23:19 · 306 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (十一)多态、虚函数、纯虚函数
虚函数的继承与实现父类子类都是虚函数,则实现依旧是在子类。 父类的非虚函数中调用虚函数,在子类实现,依旧是按照子类实现的方式执行虚函数#include <iostream>#include <string>using namespace std;class Animal{public: void play(){eat(); shout(); s...原创 2019-02-11 09:14:24 · 246 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (十)多重继承、虚继承、多态、typeinfo
1. 继承一个类的构造函数总是会先调用他父类的构造函数再执行它自身的代码。多个父类按照继承顺序执行构造函数。数据二义性问题:如果父类中有重复的变量或者方法函数,且在子类中没有。则在运行调用时会出错,编译器不知该调用哪个。解决方法:对象.父类名::同名方法/变量 这样调用 mp.MP3::getPrice(); 将公共部分提出来作为一个单独的类,并虚继承。虚继承保证被继承的对象只...原创 2019-02-02 16:03:03 · 228 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (九)运算符重载、继承
new delete 关键字重载#include <iostream>using namespace std;char mem[10000];int pos=0;class A{public: A(){cout<<"A()"<<endl;} ~A(){cout<<"~A()"<<endl;} stat原创 2019-02-02 15:59:49 · 182 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (八)运算符重载
1. 多个运算符连续,系统会按照一定的顺序逐个处理Teacher t;cout << ~t << endl;2. 运算符重载的两种情况不在类中完成Teacher& operator ~ (const Teacher& t){ ... return t;}在类中完成bool T::operator!(){ ...原创 2019-02-02 13:58:23 · 198 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (七)静态成员函数、运算符重载、临时对象
1. 局部变量下面这样写是可以的,返回时复制了一份int gg(int a, int b){ int x = a+b; return x;}下面这样写是不可以的,因为返回值是局部变量,在方法结束时就销毁了。而返回该值的引用就会出现错误,编译都通不过的。int& gg(int a, int b){ int x = a+b; return ...原创 2019-02-02 10:43:20 · 248 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (六)构造、析构、IO、运算符重载
1. 构造函数析构函数特点:对象释放时调用 只能调用一次 用来释放内存等工作 析构函数总数五参的,所以不可以重载2. 对象的new创建方法#include <iostream>using namespace std;class F{ int n; int d; int f;public: F(int n = 0, int d = 1); ~F()...原创 2018-11-07 09:34:10 · 223 阅读 · 0 评论 -
C++学习:第三章C++语言基础 - (五)构造器
1. 类的初始化 - 构造器可以将声明放在头文件中,将实现放在cpp文件中 类的初始化格式必须有对应的构造器 每个对象的构造器都会被执行,且只会被执行一次。 类的声明也可以使用默认参数 声明类时尽量避免Person p();这样的形式,因为这样声明对象容易与构造函数混淆。可以通过默认值或者其他办法避免这种格式。 在内存中函数和变量是分开储存的,但是如何同一调用、不会混乱?其实 对象....原创 2018-11-07 09:33:10 · 287 阅读 · 0 评论