c++
文章平均质量分 65
宇龍_
有些白嫖党连个赞都不点甚至直接抄走了说原创,新发布的都写到专栏里吧,哎。
私聊给群号,可进Q群咨询问题。
展开
-
由联合体union引出的大小端问题
由联合体union;大小端问题原创 2022-08-07 05:00:00 · 177 阅读 · 0 评论 -
C++类型重载
C++中的类型重载很好用,甚至可以基于类型重载新发明一种新的编程语言。下面简单写个demo来展示类型重载,如果要自己写个好用的类,还需要重载等号等运算符。class CTest{public: operator int() { return 1; } operator bool() { return false; } operator std::string() { return "ffff"; }};int main(){ CTest test; i原创 2022-05-19 21:38:06 · 628 阅读 · 0 评论 -
CString在多线程中的问题
闲来没事,聊聊CString在多线程中很容易踩的坑,这个坑很可能存在于你现在的项目中。举例:int main(){ CString str = L"test"; CString strThread1 = str; CString strThread2 = str; //将两个参数传递到各自的线程中,以下使用伪代码 CThread thread1(strThread1); CThread thread2(strThread2); thread1.wait();原创 2022-05-17 22:28:46 · 539 阅读 · 11 评论 -
子类隐藏父类的同名函数
在C++中,子类是不能重载父类函数的,因为重载只发生在同一个类中。所以在不考虑虚函数重写的情况下,子类中所有的同名函数(仅仅是与父类的函数名称相同),都会导致父类的同名函数被隐藏。见代码:#include <stdio.h>#include <stdlib.h>class CFather{public: void Test() { Print(); } void Print() { printf("CFather\n"); }};cl原创 2022-04-16 11:13:19 · 999 阅读 · 0 评论 -
C++条件变量中的notify_one()和notify_all()区别
多个线程在调用条件变量的wait方法时会阻塞住notify_one:此时调用notify_one会随机唤醒一个阻塞的线程,而其余的线程将仍然处于阻塞状态,等待下一次唤醒。notify_all:调用notify_all则会唤醒所有线程,线程会争抢锁,当然只有一个线程会获得到锁,而其余未获得锁的线程也将不再阻塞,而是进入到类似轮询的状态,等待锁资源释放后再去争抢。假如同时有10个线程阻塞在wait方法上,则需要调用10次notify_one,而仅仅只需要调用1次notify_all...原创 2022-01-13 17:17:31 · 2910 阅读 · 0 评论 -
C/C++实现关闭命令行快速编辑模式(Windows系统)
背景:开发了一个程序,需要通过cmd命令行来运行该程序,但在多次使用后发现,有时候程序会卡住,必须要按回车程序才会输出,网上搜索了一番,发现这是由于命令行窗口的快速编辑模式导致的,我希望能在调用我的程序时,该模式就被关掉,而不是让用户手动关闭。方案:在主函数开头加入几行代码即可:HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);DWORD mode;GetConsoleMode(hStdin, &mode);mode &=原创 2022-01-12 15:41:05 · 1822 阅读 · 1 评论 -
C++获取CPU核心数(用来初始化线程池)
std::thread::hardware_concurrency()该函数返回CPU核心的数量,当系统无法获取时,函数返回0#include <thread>unsigned int nCpu = std::max(std::thread::hardware_concurrency(),(unsigned int)1);原创 2022-01-12 15:37:04 · 2010 阅读 · 1 评论 -
mysql_ping阻塞的问题
在我实现的数据库连接池中有这样一个逻辑:从数据库连接池中获取到现成的空闲连接后,需要使用mysql_ping检测该连接是否可用,若该连接可用则直接返回,否则的话就释放该资源并重新创建一个新的数据库连接。出现问题:但在实际使用过程中出现了一个问题,在连接池中创建空闲连接大约5分钟后,使用mysql_ping检测连接情况的时候,该API会阻塞大约20分钟(这种阻塞的情况在某些服务器上又不存在)解决办法:1、创建数据库连接时设置MYSQL_OPT_RECONNECT(经测试,无法解决该原创 2021-12-07 11:16:42 · 1131 阅读 · 0 评论 -
yhirose服务器端发送文件
yhirose是c++开源的http库(github地址:https://github.com/yhirose/cpp-httplib),最近结合Qt用了一段时间,简直不要太好用。下面是应用到的发送文件的场景:httplib::Server svr;QByteArray btArr;svr.Get("/file", [&](const httplib::Request &, httplib::Response &res) { QFile file("E:/test.ex原创 2021-01-28 11:26:22 · 269 阅读 · 0 评论 -
Qt生成dump文件并调试
1、编译时生成pdb文件:在.pro文件中加两行配置QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFOQMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO然后重新编译,即可在exe文件的目录下生成.pdb文件。2、项目中增加崩溃时生成dump文件的代码#include <tchar.h>#include <Windows..原创 2020-09-21 13:47:52 · 2518 阅读 · 3 评论 -
C++踩坑记录
维护别人写的代码,代码如下:std::unique_ptr<Test> test(new Test); //1 实际项目中并不是使用的stl中的智能指针,是别人封装的,而且我这里没有源码test->connect(); //2代码运行正常,由于代码调整,我注释了第二行,运行报错。。。。一度怀疑智能指针的代码有问题,却苦于没有源码。。最后在在Test类中看到这一幕:Test(){}~Test{ if(NULL !=原创 2020-06-04 14:28:04 · 227 阅读 · 0 评论 -
C++单例类的内存自动回收
就是利用类静态成员在程序运行结束后会自动释放的原理,在其析构函数中释放其管理的内存。直接贴代码:#include "stdafx.h"#include <stdio.h> class Test{public: static Test&GetInstance() { if(NULL == m_pInstance) m_pInstance = new Test; return *m_pInstance; }private: static Test原创 2020-05-29 10:01:56 · 680 阅读 · 0 评论 -
C++智能指针
什么是智能指针?智能指针的原理:将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放,智能指针就是一种栈上创建的对象,函数退出时会调用其析构函数,这个析构函数里......原创 2020-03-26 11:21:37 · 306 阅读 · 0 评论 -
C++编译原理-彻底解决链接错误
前言:在开发项目的时候会经常性的出现各种各样的链接错误。究其原因是因为对C++的编译过程不理解所致。当深入理解了整个编译的过程,那么所有的问题将迎刃而解。要点:1、头文件中使用 #pragma once //vs一般自动生成//test.h#pragma once//接下来是头文件的内容2、头文件中使用条件编译#ifndef.......#define.......原创 2019-10-20 22:48:54 · 9059 阅读 · 0 评论 -
Qt设置鼠标等待状态与恢复
鼠标忙碌QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));恢复QApplication::restoreOverrideCursor();转载 2018-09-30 22:03:24 · 1899 阅读 · 0 评论 -
QT中Qtableview视图表格中点击表头进行排序
因为要显示的数据有多列,很自然的会想到要能够对显示的数据进行排序。如果直接操作model里的数据,不太方便,因为最好是能由用户自己选择按哪一列进行排序。如果通过信号槽机制,也不是很方便。然后找到QTableView下有一个setSortingEnabled()的函数。在将该函数设置为True后,在鼠标移动到表头上某一列时,可以看到出现了可以用于提示点击的上三角或下三角标志,但是,在鼠标点击过后没有...转载 2018-10-01 19:01:52 · 1401 阅读 · 0 评论 -
QSqlQueryModel自定义排序的实现
在QSqlQueryModel模型中,是不具备排序能力的,必须重写其虚函数sort来实现排序,但是可以通过代理的方式来实现排序,具体实现方法核心代码如下: queryModel = new QSqlQueryModel(this); proxyModel = new QSortFilterProxyModel(this); queryModel->setQuery...原创 2018-10-01 20:31:22 · 1925 阅读 · 3 评论 -
QTextEdit实现选中某一段文本
话不多说了,直接上代码: //此时光标所在的位置QTextCursor cursor = textEdit->textCursor();//选中从start到end的这一段文本int start = cursor.position();int end = cursor.position()+5; cursor.setPosition(start,QTextCurs...原创 2018-09-29 22:18:43 · 6272 阅读 · 0 评论 -
strcpy复制‘\0‘
今天发现了这样一个问题: char *arr = new char[10]; strcpy(arr, "wangzhaaaa"); delete []arr;执行这段代码将会报错,因为strcpy复制char*时会复制'\0',所有在new 字符数组的时候应该预留'\0'的空间,否则到时候delete的时候会报错!代码改成这样即可 char *arr = new char[11.........原创 2018-11-18 20:02:51 · 7451 阅读 · 2 评论 -
c++字符串查找函数实现
int find(const char*str,const char*sub_str) { //这里就没有判断指针是否是NULL了 //保留起始地址以计算位置 const char *temp_str = str; //默认返回结果 int ret = -1; while (*temp_str != '\0') { const ...原创 2018-11-20 22:43:10 · 1564 阅读 · 0 评论 -
strcat源码
#include <iostream>using namespace std;/*** *char *strcat(dst, src) - concatenate (append) one string to another * *Purpose: * Concatenates src onto the end of dest. Assu...转载 2018-11-20 23:00:56 · 414 阅读 · 0 评论 -
C++输出流cout的执行顺序问题
首先看一个例子:int fun1(){cout<<"num1"<<endl;return 1;}int fun2(){cout<<"num2"<<endl;return 2;}int main(){cout<<fun1()<<""&转载 2018-11-21 22:32:30 · 10650 阅读 · 0 评论 -
c++对象创建带括号与无括号的区别
class Test{public: Test() {} Test(int a) {}}1、栈上创建对象 1.1 无括号 Test a; // 调用默认构造函数,栈上分配内存创建对象 1.2 有括号 Test a(); // 无任何意义,声明一个返回值为Test对象的无参函数 1.3 有括号+参数 Test a(2); // 调用构...转载 2018-11-07 21:28:02 · 914 阅读 · 2 评论 -
strcpy源码
题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。 解说: 1.strcpy的实现代码 char * strcpy(char * strDes...转载 2018-11-19 23:29:23 · 862 阅读 · 0 评论 -
C/C++获取二维数组行列数
对于type array[A][B];形式的二维数组,可以通过计算sizeof获取行列数。sizeof(array[0][0])为一个元素占用的空间,sizeof(array[0])为一行元素占用的空间,sizeof(array)为整个数组占用的空间,行数 = sizeof(array)/sizeof(array[0]);列数 = sizeof(array[0])/sizeof...转载 2018-11-25 20:51:00 · 1894 阅读 · 0 评论 -
c++ -- 二维数组参数传递
都知道,数组名和函数名一样,可以当做指针(普通指针和函数指针)来用。关于二维数组做为形参声明和实参传递,直接看代码:#include <iostream>using namespace std;/*传二维数组*///第1种方式:传数组,第二维必须标明/*void display(int arr[][4])*/void display1(int arr[][4],...转载 2018-11-25 21:54:54 · 530 阅读 · 0 评论 -
C++用new创建二维数组的方法
问题来源在C++中,数组可以被视为一种类型——但是,不存在‘二维数组’这种类型。二维数组本身会被解释成一个一维数组:这个数组的元素类型为另一种一维数组。比如int[2][3]这个二维数组,它会被编译器视作一个元素类型为‘int[3]’的一维数组。并且,‘int[3]’和'int[4]'会被当成不同的数据类型。假设a, b为两个int型变量,如果你希望这样生成一个二维数组:new int[a...转载 2018-11-25 22:38:59 · 7149 阅读 · 0 评论 -
C++移动构造函数以及move语句简单介绍
首先看一个小例子:#include <iostream>#include <cstring>#include <cstdlib>#include <vector>using namespace std;int main(){ string st = "I love xing"; vector<string&...转载 2018-11-28 22:09:20 · 159 阅读 · 0 评论 -
strcmp源码
int __cdecl strcmp (const char *src, const char *dst){ int ret = 0 ; while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) { ++src; ...转载 2018-11-26 20:38:00 · 1049 阅读 · 0 评论 -
简化版vector
参考书上敲了一个简化版的vector,这里的简化主要是指没有用模板去实现vector,而仅以基于string的vector这个范例来演示其内部的内存分配原理:实现的功能有以下几点:实现了预先保留空间,其内存分配策略为扩大两倍容量。 基于allocator实现了申请内存和初始化对象的分离。 使用move函数实现string的移动构造。待实现的功能:模板技术 引用计数 内部其他方...原创 2018-12-01 18:17:01 · 216 阅读 · 0 评论 -
map判断值是否存在需要注意的问题
对于像这种判断map<int,int> myMap;//此时即使myMap[2]不存在,经过这样的判断之后将会创建myMap[2]并初始化为0if(myMap[2]==5){//}else{ //size已经发生了变化 cout<<myMap.size()<<endl;}特别注意:先,会在map查找这个键值的项,map如...原创 2018-12-03 22:48:08 · 4362 阅读 · 0 评论 -
c++字符数组中的'\0'’也占用一个字符
千万不要忘了,尤其是在实现string类时new字符数组的时候要考虑到,否则会造成隐患 char a[]="wang"; qDebug()<<sizeof(a); //打印结果5原创 2018-12-13 21:38:31 · 10328 阅读 · 0 评论 -
C++ 初始化操作由 case 标签跳过
最近在编毕业设计的程序, 中间遇到不少细节问题,随时整理记录下来。运行环境VS2008 C++ MFC程序switch(nIDEvent) { case 1: CString strTime ; //系统时间 CTime time = CTime::GetCurrentTime(); strTime = time.Format(_T(...转载 2018-12-27 22:39:54 · 2139 阅读 · 0 评论 -
C++的难点和优势
CSDN:你认为C++最大的难点和优势是什么?陈抒:以我经验来看构成C++学习困难有四点:知识点广泛而且难度高。按照几年前Scot Mayer在Effective C++中对C++的定义来看,C++是一门多范型语言,包括了C、面向对象编程和泛型编程。程序员需要正确理解很多基础概念,比如,堆和栈的区别、指针、指针的指针、虚函数的内部原理、继承引发的对象内存布局、多继承引发的模棱两可、模板以及...转载 2018-12-23 18:52:02 · 675 阅读 · 0 评论 -
【C++】 四种强制类型转换
总 结 去const属性用const_cast。 基本类型转换用static_cast。 多态类之间的类型转换用daynamic_cast。 不同类型的指针类型转换用reinterpreter_cast。static_cast任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast;注:顶层cons......原创 2019-01-10 17:30:57 · 318 阅读 · 0 评论 -
c++中的NULL和nullptr
由于NULL的二义性,在c++11中,出现了nullptr。所以在今后写代码的时候,空指针尽量用nullptr表示吧,原因如下:#include <iostream>using namespace std;void test(int a){ cout<<"int"<<endl;}void test(int *a){ cout<...原创 2019-01-10 21:43:53 · 10133 阅读 · 0 评论 -
栈的应用(1) 括号匹配
栈的一个重要应用就是检测括号匹配,一个简单的逻辑如下(未考虑内嵌字符串的问题):遍历整个字符串或字符数组case 1: 检测到左符号(如([{等),则直接将符号压入栈中;case 2: 当检测到右符号时(如)]}等), 若栈为空,则表达式错误; ...原创 2019-01-07 13:32:19 · 298 阅读 · 0 评论 -
C语言(复杂类型的指针)
复杂类型的指针的难点在于:函数指针返回值为函数指针时,函数指针参数为函数指针时,以下均有相关例子。例如:char (*fp)(char *,int *);定义一个名为fp的函数指针,其类型为:输入两个参数,int *型和char *型,返回参数类型为char1. int *pf(float (*a)(int));2. int (*pf(char *))[5];3. char *(*p...转载 2019-01-03 14:10:50 · 1051 阅读 · 1 评论 -
C++ 虚函数表解析
转载一篇非常优秀的文章,想必该文章对我和大家都非常有帮助!正文:前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在...转载 2019-01-08 22:21:01 · 145 阅读 · 0 评论 -
指向成员函数的指针
这里获取的指向成员函数的指针包括普通成员函数和静态成员函数,没有考虑虚函数。代码非常简单,聪明的你一看就懂!#include <iostream>class Base1{ int a; void print(){ std::cout<<"base1::print()"<<std::endl; } ...原创 2019-01-08 22:33:03 · 384 阅读 · 0 评论