
C/C++
文章平均质量分 73
i胡说
这个作者很懒,什么都没留下…
展开
-
设计模式(12):C++桥接模式
桥接模式将抽象部份与它的实现部份分离,使它们都可以独立地变化。将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化。原创 2022-01-22 23:21:56 · 471 阅读 · 1 评论 -
设计模式(11):C++状态模式
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。原创 2022-01-22 15:13:30 · 549 阅读 · 0 评论 -
设计模式(10):C++模板方法模式
模板方法定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以再不改变一个算法的结构即可重新定义该算法的某些特定步骤。通过把不变的行为搬移到基类中,去除了子类的重复代码,提供了一个很好的代码复用解决方案。原创 2022-01-20 21:57:20 · 534 阅读 · 0 评论 -
设计模式(9):C++代理模式
代理模式也称为委托模式。作用就是找一个对象来替我们访问某个对象。意图:为其他对象提供一种代理以控制对这个对象的访问。原创 2022-01-16 23:07:29 · 234 阅读 · 0 评论 -
C++模板元编程
所谓的元编程就是编写直接生成或操纵程序的程序,C++模板为C++语言提供了元编程的能力。模板使 C++ 编程变得异常灵活,能实现很多高级动态语言才有的特性(语法上可能比较丑陋,一些历史原因见下文)。普通用户对 C++ 模板的使用可能不是很频繁,大致限于泛型编程,但一些系统级的代码,尤其是对通用性、性能要求极高的基础库(如 STL、Boost)几乎不可避免的都大量地使用 C++ 模板,一个稍有规模的大量使用模板的程序,不可避免的要涉及元编程(如类型计算)。本文就是要剖析 C++ 模板元编程的机制。转载 2021-11-18 00:07:21 · 9536 阅读 · 3 评论 -
设计模式(2):C++单例模式详解
本节将阐述面试中的最常用的设计模式(单例模式),从分类,线程安全,不基于C++11标准的角度与基于C++11标准的角度,有哪些解决线程安全的单例模式方案,相信认真看完本篇文章,在以后面试中就不用担忧了。转载 2021-11-06 18:40:55 · 389 阅读 · 0 评论 -
C++11中std::future的使用
C++11中的std::future是一个模板类。std::future提供了一种用于访问异步操作结果的机制。std::future所引用的共享状态不能与任何其它异步返回的对象共享(与std::shared_future相反)( std::future references shared state that is not shared with any other asynchronous return objects (as opposed to std::shared_future))。一个futur转载 2021-11-06 17:47:45 · 2536 阅读 · 0 评论 -
C++11中std::packaged_task的使用
C++11中的std::packaged_task是个模板类。std::packaged_task包装任何可调用目标(函数、lambda表达式、bind表达式、函数对象)以便它可以被异步调用。它的返回值或抛出的异常被存储于能通过std::future对象访问的共享状态中。转载 2021-11-06 17:45:51 · 929 阅读 · 0 评论 -
C++11中std::promise的使用
C++11中的std::promise是个模板类。一个std::promise对象可以存储由future对象(可能在另一个线程中)检索的T类型的值或派生自std::exception的异常,并提供一个同步点。转载 2021-11-06 17:42:45 · 795 阅读 · 0 评论 -
C++11中std::async的使用
C++11中的std::async是个模板函数。std::async异步调用函数,在某个时候以Args作为参数(可变长参数)调用Fn,无需等待Fn执行完成就可返回,返回结果是个std::future对象。Fn返回的值可通过std::future对象的get成员函数获取。一旦完成Fn的执行,共享状态将包含Fn返回的值并ready。转载 2021-11-06 17:40:07 · 460 阅读 · 0 评论 -
C++11获取系统当前时间(精确到微秒)
使用C++11新加入std::chrono库可以获取精确到微妙的当前时间。详情见《标准库头文件 chrono》核心代码:转载 2021-11-06 17:34:17 · 9810 阅读 · 0 评论 -
C++json库nlohmann简单使用教程
Json有很多版本,选择哪个比较好呢?这里推荐使用 nlohmann/json ,不需要编译,不需要配置环境,只需要一个头文件json.h。转载 2021-11-06 17:16:21 · 9378 阅读 · 0 评论 -
C++中的friend class 用法总结
对于一个没有定义public访问权限的类,能够让其他的类操作它的私有成员往往是有用的。例如你写了一段binary tree的代码,Node是节点类,如果能够让连接多个节点的函数不需要调用public方法就能够访问到Node的私有成员的话,一定是很方便的。转载 2021-09-10 16:33:53 · 2334 阅读 · 0 评论 -
三个线程顺序打印ABC
#include <iostream>#include <thread>#include <condition_variable>#include <mutex>#include <atomic>using namespace std;atomic<int> control_int;mutex s_mutex_;condition_variable s_convar;void PrintID(int id){原创 2021-08-31 11:42:43 · 271 阅读 · 0 评论 -
VS2012:LNK4098: 默认库“MSVCRT”与其他库的使用冲突
VS2012警告:LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library原因:在使用多线程调试dll(MDd)模式的时候 <位置:配置属性 - c/c++ - 代码生成-运行时库> msvcrtd.lib 与 ibcmt.lib产生冲突网上查的VS2008解决办法:1.右击工程 - 属性 ”配置属性 - 链接器 - 输入 - 忽略特定库“,添加 ”libcmt.lib“2.右击工程 - 属性 ”配置属性转载 2021-08-27 14:40:15 · 3296 阅读 · 0 评论 -
设计模式(1):C++主要设计模式总结
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式主要是为了解决某类重复出现的问题而出现的一套成功或有效的解决方案。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。转载 2021-06-26 15:39:39 · 274 阅读 · 0 评论 -
设计模式(0):UML类图(Class Diagram)
类图(Class Diagram): 类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。转载 2020-08-10 00:02:38 · 4180 阅读 · 1 评论 -
C++11 线程池
C++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等。原创 2021-06-24 10:16:05 · 247 阅读 · 0 评论 -
C++ 之std::function()及 std::bind() 学习总结
类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。转载 2021-06-04 17:58:54 · 436 阅读 · 0 评论 -
Mac上配置Jupyter并运行C++程序
Jupyter Notebook是一个交互式笔记本,本质是一个Web应用程序,支持运行多种编程语言。本文以C++为例进行讨论。原创 2020-08-09 23:18:36 · 1435 阅读 · 2 评论 -
C++中 打印size_t 和 ssize_t
size_t x;ssize_t y;printf("%zu\n", x); // prints as unsigned decimalprintf("%zx\n", x); // prints as hexprintf("%zd\n", y); // prints as signed decimal转载 2020-06-11 14:09:04 · 1410 阅读 · 0 评论 -
C++四种强制类型转换
C语言中的强制类型转换(Type Cast)有显式和隐式两种,显式一般就是直接用小括号强制转换,TYPE b = (TYPE)a; 隐式就是直接 float b = 0.5; int a = b; 这样隐式截断(by the way 这样隐式的截断是向 0 取整的,我喜欢这么叫因为 0.9 会变成 0,1.9 变成 1,-0.9 变成 0,-1.9 变成 -1)。转载 2020-04-25 17:30:10 · 615 阅读 · 0 评论 -
c++ 函数声明后加const
类的成员函数中,有一些是不改变类的成员变量的,也就是说,这些函数是"只读"函数。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。转载 2020-04-25 16:00:55 · 2919 阅读 · 0 评论 -
C++虚继承和虚基类详解
多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。转载 2020-04-25 15:41:19 · 318 阅读 · 0 评论 -
C/C++:可变参数宏以及##和#符的使用
在C语言的宏中,#的功能就是将字符串中的宏参数进行字符串转化操作,简单说就是在将字符串中的宏变量原样输出并在其左右各加上一个双引号。转载 2020-04-25 15:21:23 · 554 阅读 · 0 评论 -
size_t和int区别
size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。转载 2020-04-24 18:04:42 · 253 阅读 · 0 评论 -
C++11 并发指南(atomic 类型详解一 atomic_flag 介绍)
本文介绍 头文件中最简单的原子类型: atomic_flag。atomic_flag 一种简单的原子布尔类型,只支持两种操作,test-and-set 和 clear。转载 2020-04-02 14:12:20 · 685 阅读 · 0 评论 -
从4行代码看右值引用
右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:转载 2020-03-31 17:11:19 · 258 阅读 · 0 评论 -
C++多线程通信:互斥与同步
在一个多线程的应用程序中,所有线程共享进程资源,协同工作。所以,线程之间的通信是编写多线程应用的必不可少的环节。线程之间的通信包括互斥、同步等,它是多线程设计中最难控制的部分,也是关键部分。转载 2020-03-31 10:17:06 · 677 阅读 · 0 评论 -
DLL程序入口DllMain详解
DllMain函数是DLL模块的默认入口点。当Windows加载DLL模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数 DLLMain。DLLMain函数不仅在将DLL链接加载到进程时被调用,在DLL模块与进程分离时(以及其它时候)也被调用。原创 2020-03-30 15:26:31 · 682 阅读 · 0 评论 -
C++ 中的 inline 用法
在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。转载 2020-03-30 14:06:24 · 251 阅读 · 0 评论 -
C++11 shared_ptr(智能指针)详解
要确保用 new 动态分配的内存空间在程序的各条执行路径都能被释放是一件麻烦的事情。C++ 11 模板库的 <memory> 头文件中定义的智能指针,即 shared _ptr 模板,就是用来部分解决这个问题的。转载 2020-03-25 15:59:31 · 233 阅读 · 0 评论 -
C++ 类(纯虚函数和抽象类)
a. 纯虚函数是一个在基类中只有声明的虚函数,在基类中无定义。要求在任何派生类中都定义自己的版本;b. 纯虚函数为各派生类提供一个公共界面(接口的封装和设计,软件的模块功能划分);c. 纯虚函数声明形式:转载 2020-03-18 15:43:53 · 572 阅读 · 0 评论 -
Makefile教程(二):示例剖析
在Linux/UNIX 系统中,习惯使用 Makefile或makfile 文件作为make命令目标文件。 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互依赖关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。转载 2020-03-17 19:19:27 · 559 阅读 · 1 评论 -
Makefile教程(一):由浅入深
Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,我们在 Makefile 中都可以进行描述。换句话说,有了 Makefile 可以使得我们的项目工程的编译变得自动化,不用每次都手动输入一堆源文件和参数。转载 2020-03-17 18:48:31 · 506 阅读 · 0 评论 -
关于gcc编译 -I -L -l的使用说明
-I /home/hello/include表示将 /home/hello/include 目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include转载 2020-03-17 16:23:18 · 273 阅读 · 0 评论 -
数组指针、指针数组、函数指针、函数指针数组解析
数组名和指针虽都代表数组首元素的地址,但意义不同。 网上有个举得比较好的例子,就是把它们分别比作省政府和市政府,数组名相当于省政府,指向首元素的指针代表市政府。如陕西的省政府在西安,而西安市的市政府也在西安,两个政府都在西安,但其代表的意义完全不同。原创 2020-03-16 10:08:19 · 246 阅读 · 0 评论 -
C++二进制输出及循环移位运算
大多数计算机处理器提供了机器级的循环命令,但在C和C++中,不直接支持循环,因此需要创建自己的循环命令。下面是实现左旋和右旋的函数:原创 2020-03-13 10:20:27 · 1266 阅读 · 0 评论 -
C++ Json库的简单使用
Json有很多版本,选择哪个比较好呢?这里推荐使用 nlohmann/json ,不需要编译,不需要配置环境,只需要一个头文件json.h。原创 2020-02-27 17:31:03 · 2144 阅读 · 0 评论 -
C++ 关于 i++ 和 ++i 的左值、右值问题
对于下面一段代码,为什么第一个取址操作错误,而第二个取址操作却是正确的。原创 2020-02-27 17:10:20 · 303 阅读 · 0 评论