![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 52
Shreck66
这个作者很懒,什么都没留下…
展开
-
C++中派生类的访问控制
派生类访问其成员的权限会受到俩个因素的影响:一是在基类中该成员的访问说明符,二是派生类的派生列表中访问说明符在介绍各种继承方式之前,首先介绍以下不常见的protected说明符,我们可以把protected看作是一个public,private中和后的产物 protected的具体规则如下 (1)和私有成员类似,受保护成员对于类的用户来说是不可访问的(但是可以被类的成员函数或友元访问) (2)原创 2015-09-06 10:11:25 · 1284 阅读 · 0 评论 -
C++中lambda表达式
在介绍lambda表达式之前,我想先介绍以下C++标准库所支持的传统谓词以及传统谓次的不足,而由此才引入的lambda表达式1.向算法中传递谓词谓词是个可调用的表达式,其返回结果是一个能作为条件的值。谓词分为一元和二元,一元的可调用对象只能有一个参数,二元只能有俩个参数 我们以一元谓词举例: C++标准库中的find_if()函数,它的功能是这样的。该函数接收一对迭代器,表示一个范围,它的第三个原创 2015-09-03 18:59:42 · 2223 阅读 · 0 评论 -
自动注册工厂消灭switch-case
之前在代码重构书中有了解过java中的反射机制可以消除switch-case,详情可以参考这篇博客http://blog.csdn.net/wwh578867817/article/details/49309789。那么我们的C++有没有类似干掉switch-case的方法?1原始的工厂是如何创建派生类对象的假如我们有个基类为Father,它有好多继承类分别为Son1,Son2,… 那么我们原始工原创 2016-01-04 23:56:40 · 2286 阅读 · 1 评论 -
利用ucontext.h中接口实现用户级别线程库
想必大家在初次接触多线程或多进程时一定会感觉这是多么的神奇!一个程序居然可以“同时”执行好多工作,此时你一定有一探其究竟的想法吧?可是无奈,这些都是内核中十分复杂的代码。对于初入计算机大门的我们,去看那些东西,的确有些困难。但是不用灰心,本篇博文我将为大家介绍一个由我自己实现的简单线程,代码也就100多行,程序还很简陋,但是我感觉这有助于我们对进程或线程的理解1.设计思路要实现线程,那么就先得有个简原创 2016-01-07 17:54:02 · 4442 阅读 · 7 评论 -
用C++11进行多线程开发
今天用c++写了一些多线程的代码,写之前感觉c线程同步中用到互斥锁,条件变量等使用起来比较麻烦,于是就自己把c中的互斥锁,还有条件变量封装了一遍,封完之后在c++11相关书中查看东西时,偶然发现原来我重复造了轮子,这些c++11早就为我们准备妥当了,哪还要自己去封。。。 接下来就总结一下,刚学来的c++11对多线程开发的知识1.线程(1)线程创建c++11创建线程相当容易,只需将线程类std::t原创 2015-12-24 15:50:25 · 980 阅读 · 0 评论 -
左值与右值
为了支持移动操作,新标准引入了一种新的引用类型–右值引用。所谓右值引用就是必须绑定到右值的引用。我们可以通过&&来获得幼稚引用1.左值和右值的定义左值和右值都是表达式的属性。一般而言,左值表达式表示的是一个对象的身份,而右值表达式表示的是一个对象的值 例如int i=3;在这里i就是一个左值,它代表了自己是个int型变量(一种身份),而3则仅仅是一个值,所以其为右值。一般来说,右值为一个临时的值,原创 2015-12-25 15:47:23 · 905 阅读 · 0 评论 -
C++11简化线程池的实现
我想用C语言写过线程池的朋友因该都知道用C语言写一个线程池有多么的麻烦,代码差不多300行左右,而且不易阅读。记得大二寒假第一次写线程池用的就是C语言,当时先参考了别人用C写的代码,说实话看起来真困难,因为C写出来的结构好乱,代码又多。我最近在实现一个自己的简单C++网络库(欢迎指点https://github.com/Miaoshuai/netlib),需要一个线程池,本来可以直接用之前拿C写的那原创 2015-12-27 16:50:46 · 7029 阅读 · 4 评论 -
当线程函数为C++类成员函数时
很多时候我们在C++多线程开发时,都会或多或少遇到线程函数为C++类中的某个成员函数,此时可能会发生什么呢?你有可能会杂么做呢? 接下来我就为大家总结一下我在这方面走过的一个历程1.问题一记得我在之前在写一个udp传输文件的程序时,我就第一次遇到了线程函数为C++类的成员函数,当时遇到的问题,大概意思如下:#include<iostream>#include <thread>#include原创 2015-12-26 20:03:10 · 18455 阅读 · 6 评论 -
一个高效的异步日志
假如让你自己去写一个日志程序,我想最原始且简单的想法因该是,首先将要写入日志文件的内容转化为字符串,然后调用write系统调用将其写入文件。这种实现方法的确就是我们程序最原始的日志方法。这种做法无疑是十分低效的,那么如何让我们的日志能够高效起来呢?本篇博文就是要给大家分享一种高效的日志–异步日志1.异步日志要实现什么?前言中我有告诉打下那种最原始且简单的日志方法很低效,那么它低效在什么地方了呢?原创 2015-12-27 19:42:12 · 9258 阅读 · 3 评论 -
记MySQL的一次启动异常
1.背景测试环境一直运行良好的MySQL突然莫名挂掉,登上机器重新启动,居然没启动起来2.寻找原因尝试一: 查找问题最简单的方法当然是先看日志报错:如图1所示MySQL启动异常系命中了红框内的断言错误所致,根据那行代码大概猜测可能是buf的长度不够导致的异常。这时候接着往下看,发现MySql提示要保证系统内存满足如下大小:key_buffer_size + (read_buffer_s...原创 2019-02-22 11:25:56 · 403 阅读 · 0 评论 -
C++标准库bind函数
上篇博客在为大家介绍lambda是先由find_if函数引入问题,由于find_if函数的第三个参数所要求的可调用对象只能由一个谓词,所以我们最后选择的解决方法是用lambda表达式。那么此问题还有其他的解决方法么?本篇博客我就为大家带来新的解决方法bind函数1.bind函数的基本介绍bind函数的最根本的作用就是可以把一个参数较多的函数给封装成参数较少的函数,因此对于上述find_if函数的问题原创 2015-09-03 21:33:26 · 11544 阅读 · 0 评论 -
C++标准库map类型
map是一种关联容器,所谓的关联容器是指支持高效的关键字查找和访问。map中的元素为一些关键字-值(key-value)对,关键字起到索引值的作用,且map中的元素是按照关键字升序排序的。还有map是个映射,所以它的关键字和值是一一对应的。接下来就为大家介绍map的用法1.map的定义我们可以用如下方法定义或初始化map//空容器map<int,string> m1;//值初始化mapmap<原创 2015-09-01 22:12:19 · 2449 阅读 · 0 评论 -
C++中直接管理内存的方式
C++中定义了new和delete俩个运算符来直接管理内存1.动态分配单一对象(1)使用new动态分配和初始化对象由于动态分配的内存是无名的,所以new不能为其分配对象名,而是返回指向该对象的指针//分配一个int型的对象int *pi = new int;默认情况下,动态分配的对象是默认初始化的,我们也可以对其直接初始化。使用()构造方式或列表初始化//构造方式初始化int *pi = new原创 2015-09-04 09:17:08 · 1039 阅读 · 0 评论 -
C++中tuple类型
tuple是C++11新标准里的类型。它是一个类似pair类型的模板。pair类型是每个成员变量各自可以是任意类型,但是只能有俩个成员,而tuple与pair不同的是它可以有任意数量的成员。但是每个确定的tuple类型的成员数目是固定的1.tuple的简单使用当我们希望将一些不同类型的数据和成单一对象时,可能大家会想到结构体(类),tuple是一种比结构体来的更加方便的类型 tuple的简单使用实原创 2015-09-06 14:01:03 · 9047 阅读 · 0 评论 -
C++中的友元
一个类的私有成员除了它的成员函数之外是不能被其他类或函数所访问的。为了能构使其他类或函数能访问类的私有成员,我们可以使其他类或函数成为该类的友元。如果想把一个类或函数作为该类的友元,则只需在在该类或函数的声明前加个friend,注意带有friend的声明必须在类的内部1.友元函数如前言所述,要想将一个函数声明为一个类的友元函数,只需在其声明前加个friend 事例#include<iostream原创 2015-08-31 21:03:25 · 643 阅读 · 0 评论 -
C++中的智能指针
上片博客为大家简单介绍了C++中开辟动态内存的方法,虽然动态内存有好多优点,但是如果我们使用不好的话有时候会给我们的程序带来灾难性的后果,今天这篇博客就为大家介绍一种安全的使用指针的方式智能指针1.智能指针的介绍新标准库为我们提供了俩种智能指针。智能指针的使用方法和常规指针基本相似,重要的区别是智能指针能够在恰当的时机自动释放它所指向的对象所占用的空间,而不需要我们人为的区释放,这一点能够使我们写出原创 2015-09-04 14:24:10 · 944 阅读 · 0 评论 -
C++中泛型算法
前面几篇博客简单的介绍了几种标准库容器,想必大家一定会感觉标准库中的各个容器的操作函数特别的少。的却标准库并没有给每一个容器单独定义很多操作函数,而是提供了一堆通用的函数来供其一起使用。1.泛型算法的概述C++中大多数算法都定义在头文件algorithm中,当然头文件numeric中定义了一组数值泛型算法 通常情况下,这些算法不会直接操作容器,只是遍历由俩个迭代器指定的元素范围来进行操作(所以这些原创 2015-09-03 13:45:59 · 671 阅读 · 0 评论 -
C++标准库类型string
string类表示可变长字符序列,包含在头文件string中,作为标准库的一部分string定义在std命名空间中1.初始化string对象std::string s1;//默认初始化s1是个空字符std::string s2 = s1;//s2是s1的副本std::string s3 = "hello";//s3是该字符串字面值的副本std::string s4(10,'h');s4的内容是原创 2015-08-30 17:20:49 · 1189 阅读 · 0 评论 -
C++中的多态性
C++中的多态性是面向对象初封装性,继承性之外的又一大特性。多态性也是一种泛型,利用多态性我们可以用不变的代码产生不同的处理结果。也可以说其是”一个接口,多种方法”。1.虚函数的声明虚函数的声明只虚在类内的函数声明前加上virtual即可 实例如下class A{ //fun1为普通函数 void fun1(void); fun2为虚函数 virtual fun2原创 2015-09-06 11:59:13 · 683 阅读 · 0 评论 -
C++标准库set类型
set(集合)和map一样也属于关联容器,和map不同的是它只保存关键字,而且关键字会按升序排序且不重复,set的内部实现是用红黑树实现的。接下来就为大家介绍set的用法1.set对象的创建事例如下//尖括号中说明set保存关键字类型set<int> s;2.向set中添加元素像其他容器一样,我们可以使用insert来向set中插入元素 实例如下#include<iostream>#inclu原创 2015-09-03 09:27:51 · 3281 阅读 · 0 评论 -
C++标准库vector类型
vector属于顺序容器,所谓顺序容器,就是元素的顺序与元素的值无关,与元素加入容器的位置相对应。 对于vector可以将其理解为可变大小数组,支持快速随机访问,在尾部之外的位置插入删除可能会比较慢。了解完概念接下来就开始学习它的用法假设以下代码前面都包含vector头文件,并包含using namespace std; 1.创建vector对象vector<int> vec;此种定义下vec容器原创 2015-09-01 18:55:04 · 696 阅读 · 0 评论 -
细说redis持久化流程
文章目录一. 概述redis持久化的俩种模式二. rdb持久化模式1.rdb持久化核心思路2.rdb持久化难点3.rdb持久化后rdb文件的格式4.rdb持久化触发条件5.rdb持久化数据安全性6.rdb持久化核心源码(bgsave为例)三. aof持久化模式1.aof持久化核心思路2.aof持久化难点3.aof持久化文件格式4.aof持久化触发条件5.aof持久化对redis性能影响6.aof文...原创 2019-05-17 10:32:32 · 1276 阅读 · 0 评论