
CC++
文章平均质量分 60
幽人_never
这个作者很懒,什么都没留下…
展开
-
C++ Prime 之 类类型转换初步学习
隐式的类类型转换 :我们先定义一个类:class Person{ public: Person()=default; Person(const std::string &s_name):name(s_name){} Person(std::istream&){} public: Person &is_samename(原创 2017-05-24 00:37:04 · 286 阅读 · 0 评论 -
C++新特性之Type Alias、noexcept、override、final
1. Type Alias(类型别名)and Template Alias(模板别名)在C++11中,我们不仅可以为类型定义别名,还可以对模板进行定义别名。别名声明的语法1. using identifier = type-id //identifier为引入的类型名,type-id为抽象声明器或者任何合法的type-id2. template <template-pa...原创 2018-09-19 23:05:44 · 1242 阅读 · 0 评论 -
C++新特性之Variadic Template
可变参数模板的定义可变参数模板是至少有一个参数宝的模板,参数包则是可以接受零个或者更多模板实参的模板形参,其格式如下:template <class ...T> class classname;template <class ...T> void func(T ...args);其中T为模板参数包,args为函数参数包。可变参数模板可以用任意数量的模板参数实例...原创 2018-09-21 00:46:23 · 402 阅读 · 0 评论 -
造轮子之异常的封装
异常的封装这里展示的是自定义异常类,继承与exception类。#include <stdexcept>namespace youren {////////////////////////////////////////////////class YR_Exception : public exception{public: YR_Exception(const st...原创 2019-08-26 12:10:37 · 159 阅读 · 0 评论 -
造轮子之锁的封装
锁异常的封装,继承与自定义的异常类即可。struct YR_Lock_Exception : public YR_Exception{ YR_Lock_Exception(const string& buffer) : YR_Exception(buffer){} YR_Lock_Exception(const string& buffer, int err) : Y...原创 2019-08-26 12:11:36 · 164 阅读 · 0 评论 -
造轮子之线程锁的封装
线程锁的封装线程锁的基本操作:1. 创建锁 int pthread_mutex_init(pthread_mutex_t*mutex, const pthread_mutexattr_t * attr); attr:创建锁的属性。一般默认为NULL,分为以下几个属性: * PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请...原创 2019-08-28 17:02:06 · 234 阅读 · 0 评论 -
造轮子之线程条件类的封装
线程条件类的封装线程条件的基本操作#include <pthread.h>//条件的销毁和初始化int pthread_cond_destroy(pthread_cond_t *cond);int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_conda...原创 2019-08-28 17:04:12 · 123 阅读 · 0 评论 -
造轮子之线程锁监控类的封装
线程锁监控类的封装互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试...原创 2019-08-30 18:50:24 · 167 阅读 · 0 评论 -
造轮子之线程控制类的封装
线程控制类的封装线程常用方法int pthread_join(pthread_t thread, void **retval);int pthread_detach(pthread_t thread);pthread_t pthread_self(void);int pthread_create(pthread_t *thread, const pthread_attr_t *attr,...原创 2019-08-30 18:51:48 · 163 阅读 · 0 评论 -
造轮子之线程安全队列的封装
线程队列的封装C++中虽然有std::queue、std::deque这些队列容器,但是不是线程安全的,因此我们需要封装一个线程安全的线程队列。定义template <class T, class Container = std::queue<T>>class YR_Thread_Queue : protected YR_ThreadLock{public: ...原创 2019-09-03 15:56:00 · 265 阅读 · 0 评论 -
造轮子之线程池的设计与封装
线程池的设计线程池,顾名思义就是一个存放了已经创建好的线程资源的池子,当有任务提交给线程池的时候,池中的某一个线程就会执行该任务,执行完毕之后就会回到池子中等待下次执行任务。从上图中我们可以看到,实现一个线程池应该具备下列要素:线程队列:提交的任务缓冲在这里线程数量管理功能任务拒绝策略队列长度线程安全队列的封装线程安全队列的封装线程池的定义class YR_ThreadP...原创 2019-09-03 15:56:45 · 211 阅读 · 0 评论 -
C++新特性之lambda表达式
什么是lambda表达式?一个lambda表达式表示以一个可以调用的代码单元。或者理解为一个匿名的内联函数。与任何函数类似,一个lambda具有返回类型、一个参数列表和一个函数体。与函数不同,lambda可能定义在函数内部。为什么要有lambda表达式?我们知道,在STL所提供的算法中,往往有两个版本。其中一个版本表现最直观的的某种运算,第二个版本则表现出最泛化的演算流程,允许用户...原创 2018-09-14 01:24:05 · 176 阅读 · 0 评论 -
C++新特性之auto指定符
在C++11发布之前,C++定义变量必须指定变量的类型,不像拥有“类型自动推断”技术的语言,比如python。当C++11发布后,C++也拥有了“类型自动推断”技术,即auto关键字和decltype关键字。我们在这里描述auto关键字的用法。语法//变量1. auto variable initializer //从其初始化器自动推导变量类型//函数2. aut...原创 2018-09-11 00:09:59 · 252 阅读 · 0 评论 -
#include的路径及顺序
在使用标准的头文件包含顺序可增强可读性,避免隐藏依赖。#include的路径项目内头文件应按照项目源代码目录树结构排列,避免使用UNIX特殊的快捷目录.(当前目录)或..(上级目录)。例如,project/src/base/logging.h应该按照如下方式包含:#include "base/logging.h"#include的头文件包含顺序如果dir/foo.c...原创 2018-09-10 00:25:44 · 11745 阅读 · 0 评论 -
C++ Prime 之类类型转换(2)
在上一篇的类类型转换中,我们只是学习了将实参的对象类型转换为类类型。这篇我们将学习将一个类类型的值转换为其他类型。我们要首先了解什么是"类类型转换运算符"?书上的定义说:是类的一种特殊的成员函数,形如:`operator *type*() const;` 其中type可以表示任何类型(void除外),只要该类型可以作为函数的返回类型。 注意:类型转换没有显式的返回类型,也没有形参,而且必须为类的原创 2017-05-26 22:52:02 · 261 阅读 · 0 评论 -
如何用C++实现String类?
我们要实现string类,首先必须了解string类都有哪些操作? 从C++原生string类中我们可以知道:1. string类的定义和初始化: string s1; //默认初始化,s1是一个空字符串 string s2=s1; //s2是s1的副本 string s3="hello"; string s4(10,'c'); /原创 2017-07-01 23:37:55 · 376 阅读 · 0 评论 -
理解栈帧
栈顾名思义,“栈”就是相当于”客栈”的意思,在计算机系统中,栈就是数据暂存的一片动态内存。栈可以用来实现函数参数的传递,局部变量的分配和释放,也可以用来储存返回信息,保存寄存器以供恢复调用前处理机状态。每当调用一个函数,系统会为这个函数分配栈空间,为单个函数分配 的栈空间为栈帧(stack frame)。 图中寄存器%ebp为帧指针,寄存器%esp为栈指针假设有一段代码:#include<s原创 2017-07-16 15:36:00 · 324 阅读 · 0 评论 -
内存对齐与位域
内存对齐:在讨论之前我们先看一个栗子:#include<iostream>using namespae std;int main(){ struct A { int a; char b; char c; }; struct B { char b; int a; char c;原创 2017-07-20 13:18:39 · 674 阅读 · 0 评论 -
可变参数函数——printf模拟
我们先看看可变参数函数是怎样用的?printf("%d",value);printf("%s",str);printf("%d %s",value,str);printf函数的声明为:int printf(char const* const _Format,...);//其中三个点表示变参宏可变参数函数的原理: 可变参数列表的实现是由stdarg.h中几个宏组成的:va_list,va_st原创 2017-07-17 14:06:18 · 234 阅读 · 0 评论 -
宏函数与普通函数的区别
我们由问题展开:1.什么是宏函数?2.宏函数与普通函数的相同点?不同点?3.宏函数与普通函数的优缺点?什么是宏函数?在这之前看一下宏的定义:宏宏是根据一系列预定义的规则替换一定的文本模式。#define BUFFER_SIZE 1024预处理阶段, fun=(char )malloc(BUFFER_SIZE); 会被替换成 fun=(char )malloc(1024);#define NUMBER原创 2017-08-02 07:52:49 · 3052 阅读 · 0 评论 -
placement new
placement newoperator new1.void* operator new (std::size_t size);2.void* operator new(std::size_t size,const std::nothrow_t& nothrow_value) noexcept;3.void* operator new (std::size_t siz...原创 2018-04-01 23:36:32 · 171 阅读 · 0 评论 -
STL源码剖析--迭代器概念与traits技法
迭代器概念与traits技法3.1 迭代器设计思维STL的中心思想在于:将数据容器和算法分开。而迭代器就是将数据容器与算法连接起来。以find()函数为例:template&lt;class InputIterator,class T&gt;InputIterator find(InputIterator first, InputI...原创 2018-07-28 10:17:07 · 206 阅读 · 0 评论 -
C++新特性之decltype指定符
在上一篇我们学习了C++新特性的auto特性,其功能是对变量和函数的返回值进行类型推断。在C++新特性中还具有一个类型推断的指定符,那就是decltype。 C++新特性之auto指定符 那既然有了auto,那为什么还要出个decltype?两者有什么不同?等我们学完这个指定符就明白了。语法1. decltype(entity) //检查实体的声明类型2. de...原创 2018-09-11 23:59:35 · 237 阅读 · 0 评论 -
C++从源文件到执行文件的过程
1.编译链接的目的编译的目的是将C语言转换为计算机可以直接识别的语言,即机器语言(0和1)。众所周知,C语言是高级语言,它是由机器语言,汇编语言逐步演化而来,并非计算机可以直接识别。所以我们要将C语言转化为计算机可以识别的语言,就要进行编译和链接。2.编译链接的过程2.1 编译过程预处理 通常用来处理带#的行和删除注释。 比如处理条件编译(#if、#ifdef、#...原创 2018-09-10 00:23:08 · 1294 阅读 · 0 评论 -
造轮子之常用函数的封装
常用函数的封装常用函数的封装:字符串操作常用函数大小写转换函数分割字符串函数字符串转换函数字符串替换函数时间操作常用函数帮助类定义字符串操作封装class YR_Common{public: //去掉头部及尾部的字符或者字符串 //bool为true 去除s中的每个字符,为false去除s字符串 static string trim(con...原创 2019-09-03 15:58:16 · 233 阅读 · 0 评论