
C++
文章平均质量分 70
C++
王江奎
这个作者很懒,什么都没留下…
展开
-
Qt学习笔记
在对C++语法比较熟悉以后发现对Qt感到比较亲切,但是Qt还是有一些比较核心的概念需要了解。与一般的GUI框架类似,Qt中也有各种各样的组件,组件之间有父子关系,都有一个大的事件循环(qApplication.exec())。但是不同的地方在于一般的GUI(例如Swing和Tkinter)都是直接通过给组件监听事件来进行交互,而Qt是通过信号(signals)和槽(slots)机制实现对事件的监听,个人觉得这种方式耦合性更低,功能更加强大。信号和槽都是函数,通过connect函数完成通信:static原创 2021-06-09 18:09:32 · 421 阅读 · 0 评论 -
C++中decltype遇到引用类型时的隐藏陷阱
为了进一步理解这个问题,我借助了《Effective Modern C++》中条款 4 提到的一个技巧:通过声明一个未定义的模板类,并在模板实例化时查看编译器的类型推导报错信息。返回的仍旧是引用类型。可以解决问题,但这让代码的复杂度增加了。可以获取变量的声明类型。然而,当变量是一个引用类型时,但是,编译器却发出警告,提示。这种方式更容易阅读,也避免了使用复杂的类型萃取。这种方式可以减少重复声明,提升代码可读性。返回值中的引用部分,再手动加上。在这段代码中,我的目标是让。如果类型较长,可以通过。原创 2025-01-06 16:30:43 · 472 阅读 · 0 评论 -
C++ 中如何优雅地返回一个递归闭包函数?
通过闭包函数,将建图与DFS逻辑绑定,简化了调用接口,同时减少了显式参数传递的麻烦。这种高级技巧在C++中并不常见,但在特定场景(小型、局部的递归场景)下能够显著提升代码的可读性与复用性。然而,闭包函数的使用也需要谨慎,特别是在C++中,变量的捕获方式直接影响代码的安全性与性能。通过对捕获规则(值捕获、引用捕获、移动捕获)的深入理解,可以更安全、高效地使用闭包,提高代码质量。原创 2025-01-03 16:12:09 · 957 阅读 · 0 评论 -
C++ 条件变量的使用
并发编程纷繁复杂,其中用于线程同步的主要工具——条件变量,虽然精悍,但是要想正确灵活的运用却并不容易。希望大家看完下面的介绍能够得到想要的答案。原创 2022-11-16 13:03:51 · 1693 阅读 · 3 评论 -
C++ 模板函数、模板类:如果没有被使用就不会被实例化
C++ 模板函数、模板类 使用和实例化的关系原创 2022-11-15 18:47:28 · 949 阅读 · 0 评论 -
C++ STL中的allocator
STL allocator剖析原创 2022-10-25 15:46:24 · 1034 阅读 · 2 评论 -
C++不要让函数返回一个右值引用
在C++中如果我们让函数返回一个右值引用会发生什么?结论是不要让函数返回右值引用。原创 2022-10-17 19:40:48 · 939 阅读 · 1 评论 -
C++ map/unordered_map元素类型std::pair<const key_type, mapped_type>陷阱
我们要千万小心`map`和`unordered_map`的元素类型为`std::pair`,如果忘记`const`可能会不小心产生拷贝操作,不仅仅会带来性能损耗,而且可能会产生RuntimeError。原创 2022-07-14 16:16:46 · 648 阅读 · 0 评论 -
muduo网络库使用入门
使用muduo网络库实现一个简单的echo服务器学习如何使用原创 2022-07-11 18:08:16 · 2221 阅读 · 0 评论 -
C++ 工具函数库
在写一些大型项目的过程中经常需要一些工具函数,例如获取随机数、计时器、打印函数、重要常量(如最大值)等,由于每一个工程都自己手动实现一个实在是太傻,我将其总结放入一个文件中。.........原创 2022-07-09 10:33:31 · 675 阅读 · 0 评论 -
C++读写锁造成死锁
C++14支持std::shared_timed_mutexC++17支持std::shared_mutex前者相比后者支持的操作更多,但是后者相对性能更好。使用std::lock_guard<std::shared_mutex>和std::unique_lock<std::shared_mutex>互斥访问使用std::shared_lock<std::shared_mutex>实现共享访问(C++14),使用方式和std::unique_lock相同多个原创 2022-05-10 19:25:14 · 1310 阅读 · 0 评论 -
C++ 单例模式 call_once : terminate called after throwing an instance of ‘std::system_error‘
使用C++11中的call_once实现单例模式,解决出现的 'terminate called after throwing an instance of ‘std::system_error'问题原创 2022-04-29 11:52:08 · 5527 阅读 · 7 评论 -
Clion远程部署和运行
绪论作为Clion的忠实粉丝,现在的我的几乎所有的coding都是通过Clion完成。因为需要在服务器上进行开发,又离不开Clion,就了解了如何通过Clion远程部署和开发。主要是借鉴了博客:使用Clion优雅的完全远程自动同步和远程调试c++。如果我哪里没有讲清楚可以去借鉴一下这篇博客。我们的目标是在本地进行编码,运行在服务器上。设置远程工具链更新/安装cmake借鉴了博客:在Linux上安装其他版本的cmake 或 升级cmake首先我们需要保证服务器上的cmake版本至少为3.19,否原创 2022-04-20 15:05:54 · 2204 阅读 · 1 评论 -
第287场周赛
绪论虽然是上周日参加的比赛,但是这周没有怎么学习,每天就是玩耍。也导致对周赛的总结迟迟没有进行。想着再拖下去下次周赛都要开始了,在这里补一下。这场比赛总体比上场简单一些,但是最后一道题因为忘记初始化类内变量导致调试好久,血泪教训。题目分析A:转化时间需要的最少操作数因为单独考虑小时、分钟太过繁琐,我的方法是将其转换成时间戳(类似chrono的time_since_epoch方法)。class Solution {public: int convertTime(string curre原创 2022-04-08 10:37:41 · 954 阅读 · 0 评论 -
C++ array初始化需要双层大括号
对于array的初始化我们可以使用列表初始化:array<int, 8> test = { 1, 2, 3, 4, 5, 6, 7, 8};但是当我们不再使用简单的内置类型array时:array<pair<int, int>, 8> dirs = { {-1, -1}, {-1, 0}, {-1, 1},原创 2021-07-24 16:27:21 · 1944 阅读 · 1 评论 -
类的成员函数可以访问属于该类的任意对象的私有变量
之前在书上看到这句话的时候觉得是废话嘛,如果成员函数都不能访问那私有变量不就变成了花瓶了。然而发现自己还是太naive。这句话的意思是:在类的作用域内,包含成员函数、静态成员函数和友元函数内,可以访问类对象的私有变量。特殊的,对于成员函数来讲,如果参数中有属于同一个类的其他对象,那么我们还可以访问其他对象的私有变量,而不仅仅是自己的。可以这样理解,在类的作用域内部,没有所谓的权限控制,只有在外部才区分私有、保护和公有。例如:class A{ int x = 1;public: v原创 2021-06-24 10:13:59 · 2185 阅读 · 0 评论 -
C++输入输出:cin/cout 还是 scanf/printf?
相信使用C++的人都有一种迷惑或者是不自信:在输入输出的时候是不是应该使用scnaf/printf更好呢,因为传说cin/cout慢出龟速,我当时也长期被这个所困扰,后来在阅读C++ primer第五版的时候我自己做了一个测试,发现如果不使用std::ios_sync_with_stdio(false);关闭和C库函数的同步的话的确scanf/printf快很多,大概相差五倍,但是如果关闭同步的话,cin/cout是比scanf/printf快8%-10%的。(这两个数据是我后面看别人测量的,我自己只是简单原创 2021-06-19 00:24:30 · 1040 阅读 · 0 评论 -
Qt发布程序
Windows:https://www.cnblogs.com/linuxAndMcu/p/10974927.htmlUbuntu:https://blog.youkuaiyun.com/u014779536/article/details/107854060原创 2021-06-10 16:46:32 · 1224 阅读 · 0 评论 -
C++ JSON库:JSON for Morden C++
最近因为项目的需要,需要对JSON进行一定的数据处理,因为想要用C++进行编码,便对C++的JSON库进行的调研,发现这个库比较好用:JSON for Morder C++。原创 2021-04-22 18:35:11 · 1899 阅读 · 0 评论 -
C++Primer学习笔记:第7章 类
类的基本思想是数据抽象data abstraction和封装encapsulation。数据抽象是一种依赖于接口interface和实现implementation分离的编程技术在类中,由类的设计者负责考虑类的实现过程,使用该类的程序员只需要抽象地思考类型做了什么,而无须了解类型的工作细节执行加法和IO的函数应该定义成普通函数,执行复合赋值运算的函数应该是成员函数成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在类的外部成员函数通过一个名为this的额外的隐式参数来..原创 2021-03-14 21:03:07 · 213 阅读 · 0 评论 -
C++Primer学习笔记:第8章 IO库
C++语言不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IOiostream定义了用于读写流的基本类型fstream定义了读写命名文件的类型sstream定义了读写内存string对象的类型标准库使得我们能够忽略这些不同类型的流之间的差异,是通过继承机制实现的不能拷贝或者对IO对象赋值,因此也不能将形式参数或者返回类型设置为流类型,进行IO操作的函数通常是已引用方式传递和返回流,读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的strm::iosta..原创 2021-03-06 23:56:47 · 195 阅读 · 0 评论 -
C++Primer学习笔记:第6章 函数
通过调用运算符()调用函数函数的调用完成两项工作:用实参初始化函数对应的形参将控制权转移给被调用函数:主调函数的执行被暂时中断,被调函数开始执行尽管实参与形参存在对应关系,但是并没有规定实参的求值顺序。编译器能以任意可行的顺序对实参求值任意两个形参都不能同名,形式参数名是可选的,但是由于我们无法使用未命名的形式参数,所以形式参数一般都应该有一个名字函数的返回类型不能是数组类型或者函数类型,但可以是指向数组或者函数的指针函数体必须是大括号包围的!普通局部变量对应..原创 2021-03-06 23:55:22 · 1578 阅读 · 1 评论 -
z3 C++学习笔记
因为项目需要使用z3库来解决问题,所以自己学习了一下,结果发现网上教程比较少,而且大部分都是使用Python,而我本人是C++的忠实信徒,在知道C++也可以使用z3库以后我毫不犹豫地着手用C++使用z3,但是我很快发现,网上基本没有关于C++使用z3的教程(中文社区一点都没有),因此我记录一下我自己的学习过程希望能够帮助到其他学习的人。教程链接网上现有的有三个教程:官方example.cpp文档:https://github.com/Z3Prover/z3/blob/master/examples.原创 2021-03-06 17:58:38 · 4163 阅读 · 8 评论 -
C++Primer学习笔记:第5章 语句
一个表达式末尾加上分号就变成了表达式语句。最简单的语句是空语句(一个单独的分号):语法上需要一条语句但是逻辑上不需要复合语句是指用花括号括起来的(可能为空)语句和声明的序列:用在语法上需要一条语句,但是逻辑上需要多条语句的地方C++规定在同一个语句块中else与离他最近的if匹配case标签必须是整形常量表达式,如果某个case标签匹配成功,将从该标签开始往后顺序执行所有的case分支,除非程序显式中断,标签不应该孤零零地出现,它后面必须跟一条语句或者另外一个case标签C++规..原创 2021-02-24 21:43:25 · 164 阅读 · 0 评论 -
C++Primer学习笔记:第4章 表达式
表达式由一个或多个运算对象组成,对表达式求值将得到一个结果。字面值和变量是最简单的表达式,其结果就是字面值和变量的值。把一个运算符和一个或多个运算对象组合起来可以生成较复杂的表达式。重载运算符包括运算对象的类型和返回值的类型,都是由该运算符定义的;但是运算对象的个数、运算符的优先级和结合律都是无法改变的当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。需要右值的地方可以用左值来代替,但是不能把右值当成左值使用。赋值运算符需要一..原创 2021-02-24 21:42:30 · 329 阅读 · 0 评论 -
C++Primer学习笔记:第3章 字符串、向量和数组
可以使用using声明而无需专门的前缀:using namespace::name;.。位于头文件的代码一般来说不应该使用using声明,这是因为头文件的内容会拷贝到所有引用他的文件中去,如果头文件中有某个using声明,那么每个使用了该头文件的文件都会有这个声明。对于某些程序来说,由于不经意间包含了一些名字,反而可能产生始料未及的名字冲突。使用string类型需要添加头文件#include<string>,并且要对string进行声明:using std::string;str..原创 2021-02-24 21:41:45 · 267 阅读 · 0 评论 -
C++Primer学习笔记:第2章 变量和基本类型
空类型不对应具体的值,仅用于一些特殊的场合long的长度为32位,float有7个有效位,double有16个有效位如果数值超过了int的范围,应该用long long而不是long,long一般和int一样大在算术表达式中不要使用char或bool,只有在存放字符或布尔值时才是使用它们。因为类型char在一些机器上是有符号的,而在另一些机器上又是无符号的,所以使用char进行运算特别容易出现问题。如果需要使用一个不大的整数,那么明确指明它的类型是signed char或unsigne..原创 2021-02-24 21:40:45 · 222 阅读 · 0 评论 -
C++Primer学习笔记:第1章 开始
本博客为阅读《C++ Primer》(第5版)的读书笔记第1章 开始在大多数系统中,main的返回值被用来指示状态。返回值0表示成功,非0的返回值的含义由系统定义,通常用来指出错误类型。在Unix中程序运行以后返回值保存在$?中(必须在刚运行后打印输出)编译时可能需要加上-std=c++11打开对C++11标准的支持,一般会加上-Wall参数,可以对有问题的程序结构发出警告如果想要通过打印语句进行调试,一定要及时使用endl操纵符刷新流,否则如果程序崩溃,可能无法得到输出信息,从而导致关于程序崩溃原创 2020-10-26 19:48:58 · 342 阅读 · 2 评论 -
C++ cin 实现循环读入
习惯了使用while(~scanf("%d",x)){}来实现循环读入,但是有时候使用泛型编程的时候就必须使用C++中的cin,但是当我想要实现循环读入的时候却发现有些困难。我们可以看一下下面这个简单的例子:#include <iostream>using namespace std;int main(){ int n; while(cin>>...原创 2020-04-29 14:40:44 · 11198 阅读 · 4 评论 -
使用头文件的原因和规范
原因通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担规范在开...原创 2020-03-24 08:55:57 · 251 阅读 · 0 评论 -
C++函数默认参数
声明是用户可以看到的部分,客户非常信任地使用这个特性,希望得到一定的结果,但是你在实现里使用了不同的缺省值,那么将是灾难性的。因此编译器禁止声明和定义时同时定义缺省参数值。类的成员函数的参数表在声明时默认参数位于参数表右部,如int fn(int a,int b=0,int c=5)之类的,但在它定义的时候则不能加默认参数,只能写int fn(int a,int b,int c);若声明时没有...转载 2019-12-16 15:56:01 · 208 阅读 · 0 评论 -
C++笔试复习
基础知识点C++中对象数组在定义的时候全部进行实例化(与Java不同,Java相当于只是定义了一个指针数组,没有进行实例化)面向对象程序设计主要有四个特点:抽象、继承、多态、封装类是某一类对象的抽象,对象是类的具体实例,类和对象的关系是一种数据类型与变量的关系默认构造函数有两种:无参构造函数和所有参数都有默认值的构造函数(两者不能同时存在)常对象只能调用它的常成员函数,不能调用普通函数...原创 2019-12-16 11:50:29 · 240 阅读 · 0 评论 -
C++类模板实例化条件
(我不想了解这个,可是考试要考。。。。并不是每次使用模板类都会实例化一个类声明一个类模板的指针和引用不会引起类模板的实例化如果检查这个指针或引用的成员时时,类模板会实例化定义一个对象的时候需要有类的定义,会实例化在需要知道该类所占空间的大小时sizeof()new类模板的成员函数本身也是一个模板。标准C++要求这样的成员函数只有在被调用或者取地址的时候,才被实例化用来实例化...原创 2019-12-12 15:12:45 · 375 阅读 · 0 评论 -
【C++学习笔记五】模板
模板是泛型编程的基础模板函数定义的一般形式:template <class type> ret-tye func-name(parameter list){}同时我们还可以使用类模板:template <class type> class class-name{}在这里typename可以代替class,两者等价。...原创 2019-12-08 20:32:58 · 187 阅读 · 0 评论 -
C++析构函数执行顺序
今天发现主程序中有多个对象时析构函数的执行顺序不是对象定义的顺序,而是对象定义顺序反过来。思考了一下,结合之前继承、成员对象等的析构函数执行的顺序,我觉得析构函数执行的顺序为:构造函数的顺序反过来,可能是用栈什么的保存?机理我也不清楚,不过测试看起来好像是这个样子。#include<iostream>using namespace std;class A{ int id...原创 2019-12-08 15:41:33 · 497 阅读 · 0 评论 -
C++转换构造函数和类型转换函数
参考博客:https://blog.youkuaiyun.com/feiyanaffection/article/details/79183340隐式类型转换如果不同类型的数据在一起操作的时候编译器会自动进行一个数据类型转换。例如常用的基本数据类型有如下类型转换关系:转换构造函数构造函数有且仅有一个参数有这种构造函数时我们就可以从其他类型隐式地转换为类类型。因此成为转换构造函数。例如:cl...原创 2019-12-08 12:55:37 · 223 阅读 · 0 评论 -
类的声明与定义
类的前向声明:class A;在声明之后,定义之前,类A是一个不完全类型,即知道A是一个类,但是不知道包含哪些成员。不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针以及引用,或者用于声明使用该类型作为形参类型或者返回类型的函数。因此,在类体中我们不能定义一个这个类的对象,只能定义该类的指针。...原创 2019-12-08 10:13:44 · 649 阅读 · 0 评论 -
C++不能被声明为虚函数
虚函数是为了实现多态,但是显然并不是所有函数都可以声明为虚函数的。不能被声明为虚函数的函数有两类:不能被继承的函数不能被重写的函数因此,这些函数都不能被声明为虚函数普通函数构造函数静态函数友元函数内联成员函数参考博客:https://blog.youkuaiyun.com/judgejames/article/details/87914127...原创 2019-12-07 23:11:33 · 237 阅读 · 0 评论 -
C++this指针的用法
参考博客:https://www.cnblogs.com/zhengfa-af/p/8082959.html在 访问对象的非静态成员时会隐式传递一个参数,即对象本身的指针,这个指针名为this。例如:class A{ int a=1; public: A(){} void GetA(int a){cout<<this->a<<endl;}};in...原创 2019-12-06 15:21:19 · 161 阅读 · 0 评论 -
C++(静态)(常量)数据进行初始化问题以及静态变量析构
在C++11标准以前我们都不可以在类中对数据成员初始化,仅能在构造函数中进行初始化:class A{ int a,b; double c; string d; A():a(1),b(2),c(3),d(""){}};在C++11标准以后我们可以在类中对非静态成员进行初始化。实际上的机制是在调用构造函数的时候再根据类中的初始化进行赋值。class A{//和上面的方法等价,这样写使...原创 2019-12-06 12:29:26 · 1242 阅读 · 0 评论