重学C++之读书笔记
文章平均质量分 77
阅读《C++ primer》、《STL源码剖析》、《深度探索C++对象模型》、《Effective C++》等C++书籍时所做的读书笔记。
jiange_zh
linux 网络编程 C++ 算法 数据结构
展开
-
C++异步调用利器future/promise实现原理
前言在异步编程中,各种回调将让人眼花缭乱,代码分散,维护起来十分困难。boost和C++11 的 future/promise 提供了一个很好的解决方案,使得代码更加漂亮、易维护。在工作中,我也用过几次future/promise,但是还是十分生疏,所以决定学习下它的原理,用起来才更加顺畅。查了很多资料,发现很多语言都有这个机制,但是关于C++的promise的资料却很少,只有一些使用的教程,而没有原创 2016-09-14 23:24:42 · 28809 阅读 · 10 评论 -
C++侵入式智能指针的实现
简介在现代C++编程中,智能指针给我们在资源管理上带来了很多好处,这里就不多说了。在工作中,我们常常会用智能指针来管理资源,其中最常用的就是引用计数类智能指针了(shared_ptr)。资源共享型的智能指针有两种实现,一种是侵入式,一种是非侵入式。在教材里比较常见的是非侵入式的,它的实现完全放在智能指针模板里,模板类有一个用于保存资源类对象的指针变量,和一个用于记录资源对象使用计数的指针变量,这两个原创 2016-09-12 13:07:23 · 4702 阅读 · 0 评论 -
《深度探索C++对象模型》—Function语意学(The Semantics of Function)
Function语意学(The Semantics of Function)Member的各种调用方式Nonstatic Member FunctionsC++的设计准则之一:nonstatic member function 至少必须和一般的nonmember function有相同的效率。编译器内部会将“member函数实体”转换为对等的“nonmember函数实体”://1. 改写函数签名,安原创 2016-09-03 11:51:20 · 1073 阅读 · 0 评论 -
《深度探索C++对象模型》—构造函数语意学(The Semantics of constructors)
前言这一章中,作者将挖掘编译器对于“对象构造过程”的干涉。构造函数语意学(The Semantics of constructors)Default Constructor 的建构操作你是否有过如下的错觉:没有定义默认构造函数的类,编译器都会生成一个默认构造函数。编译器生成的默认构造函数会明确初始化类中每一个数据成员。C++标准规定:如果类的设计者并未为类定义任何构造原创 2016-09-02 16:55:37 · 1096 阅读 · 1 评论 -
《深度探索C++对象模型》—关于对象(Object Lessons)
前言“本书是由一位编译器设计者针对中高级C++程序员所写的。隐藏在这本书背后的假设是,程序员如果了解C++对象模型,就可以写出比较没有错误倾向而且比较有效率的代码。”正是因为在实际编程中吃了亏,所以才觉得读这本书是十分有必要的,比如之前的一篇博文:http://blog.csdn.net/jiange_zh/article/details/51871782如果读过这本书,想必也就不会有所困惑了。下面原创 2016-09-02 11:24:12 · 1291 阅读 · 1 评论 -
C++模板阶段性小结
以前在学校C++模板用的比较少,碰到的问题也就少。 而在工作中模板的使用随处可见,在遇到问题中学习,也就对模板有了新的认识和理解。下面是一个简单的小结。模板本身不是类或函数首先这一点是需要最先明确的,之前就是没有理解这一点,所以对模板的认识一直停留在表明。我们借助以下例子来理解这一个点:template class AutoList{ public:原创 2016-08-20 15:02:03 · 1965 阅读 · 0 评论 -
C++实现根据类名动态生成类对象
在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新。之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher。在需要使用数据的时候,通过:F原创 2016-08-09 22:33:22 · 12044 阅读 · 2 评论 -
C++调用空指针对象的成员函数——静态绑定与动态绑定
最近代码中看到调用空指针对象的成员函数的写法,联想起上次碰到的问题:C++类的成员函数存储方式(是否属于类的对象)两者的本质是一样的,上次只是简单地讨论了下,这次从编译器的角度,来谈一谈这个知识点。一个简单的例子:class MyClass { public: int i; void hello() { printf("hello\n"原创 2016-08-06 13:31:09 · 2135 阅读 · 0 评论 -
实习点滴 - 破窗理论、C++ 函数模板静态库
最近在搬砖,本以为仅仅是体力活而已,无奈自己功力不够,处处碰壁。这次的需求及其背景:业务中有一个recommendId的东西,类型是string或者vector< char >。第一个字节(即recommendId[0])用来标识数据所属的类型,比如4代表商业化广告,5代表游戏广告等,然后后面的字节或者是string类型的数据,或者是jce类型的数据(这个即为编码协议)。最近开始推广使用新的协议,第原创 2016-07-28 00:10:53 · 2315 阅读 · 0 评论 -
C++类的成员函数存储方式(是否属于类的对象)
今天在看TAF源码的时候,发现下面一段有趣的代码:getSmallerProxyPrx = Application::getCommunicator()->stringToProxy<GetSmallerPrx>(MobileAssist.JiangeSmallerServer.GetSmaller);//此处T为GetSmallerPrxtemplate<class T> T stringTo原创 2016-07-10 15:42:41 · 4627 阅读 · 2 评论 -
【C++编译】gcc的-l参数和-L参数
今天在编译服务的时候,出现了一个错误:/usr/bin/ld: cannot find -lxxx于是查了一下,这个错误是因为链接程序ld在指定目录里找不到libxxx.so这个库。那么,上面所说的“指定目录”是哪些目录,以及 -l的作用是什么呢?-l参数:用来指定程序要链接的库,-l参数紧接着就是库名。这里的库名并非真正的库文件名。以库名为math的库为例,他的库文件名是libmath.so或者原创 2016-06-23 23:15:24 · 9300 阅读 · 0 评论 -
C++11 多线程 future/promise简介
1. < future >头文件简介Classes std::future std::future_error std::packaged_task std::promise std::shared_futureFunctions std::async std::future_category2. std::future简单来说,std::future提供了一种访问异步操作结果的原创 2016-06-07 13:29:27 · 34407 阅读 · 3 评论 -
C++11 std::function、std::bind
1. functionstd::function对象是对C++中现有的可调用实体的一种类型安全的包裹(像函数指针这类可调用实体,是类型不安全的)。关于function的例子:#include < functional>std::function< size_t (const char*) > print_func;// normal function -> std::function object原创 2016-06-06 22:34:07 · 5452 阅读 · 0 评论 -
C++ 智能指针 auto_ptr 和 shared_ptr
首先,如果你不知道什么是智能指针,请先移步:C++智能指针简单剖析 1.auto_ptr#ifndef AUTO_PTR_H#define AUTO_PTR_Htemplate<typename T>class auto_ptr{ public : //使用explicit关键字避免隐式转换 explicit auto_ptr(T* p=0);原创 2016-03-08 21:51:50 · 1641 阅读 · 0 评论 -
C/C++ 内存对齐
一个Class对象需要占用多大的内存空间?非静态成员变量总合。(not static)加上编译器为了CPU计算,作出的数据对齐处理。加上为了支持虚函数(virtual function),产生的额外负担。下面我们主要讨论下C的数据对齐处理。首先,为简单起见,我们先讨论在没有#pragam pack宏的情况下,内存对齐的三条规则:数据成员对齐规则:第一个数据成员放在offset为0的地方,之原创 2016-03-06 14:37:38 · 1456 阅读 · 0 评论 -
STL源码学习——仿函数和配接器
仿函数仿函数又称函数对象,它本质上是 一种具有函数特质的对象,它 重载了operator()运算符,我们可以像使用函数一样使用该对象。比如:template class T>struct greater{ bool operator()(const T &x, const T &y) const { return x > y; } };//方式1greateri原创 2016-03-06 13:44:49 · 3403 阅读 · 4 评论 -
STL源码学习——迭代器(iterators)与traits编程技法
今天反复看了侯捷的《STL源码剖析》第三章,来回翻了3,4遍,终于基本上看懂了,在此作整理和总结。迭代器迭代器模式的定义:提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素。迭代器在STL中得到了广泛的应用,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。也就是说,数据容器和算法是分开的。下面以算法find原创 2016-03-05 17:18:47 · 1734 阅读 · 3 评论 -
STL源码学习——空间配置器
前言最近开始找实习了,对于STL的实现,一知半解,挺多认识都停留在表层,所以还是想看一看源码,所以找了侯捷的《STL源码剖析》——源码之前,了无秘密。我并不打算第一遍就把它全部弄懂,好的知识和代码总是需要反复咀嚼才能领悟其思想,也许以后会再读很多遍。最近时间比较紧张,准备面试,查漏补缺,所以都没什么时间写博客,本来希望赶赶进度自己把这本书大致地看一遍就好,但是现在还是些了博客,强迫自己慢下来,把学的原创 2016-03-04 23:34:31 · 1486 阅读 · 3 评论 -
C/C++面试常见的几个库函数详解(strcpy,memcpy,memset,atoi...)
前言在面试中,常常会被问到几个库函数的实现,虽然代码很短,涉及的细节却特别多,因此特别受面试官青睐,所以要把他们熟记于心,方能应对自如。strcpy()原型声明:char strcpy(char dest, const char *src); 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间原创 2016-03-04 14:44:40 · 3959 阅读 · 6 评论 -
重学C++ (十二) 模板特化和偏特化
一、模板的定义1.类模板template class T>class compare{public: bool IsEqual(T t1, T t2) { return t1 == t2; }};int main(){ char str1[] = "Hello"; char str2[] = "Hello";原创 2016-03-03 22:54:11 · 8521 阅读 · 3 评论 -
重学C++ (十一) OOP面向对象编程(2)
转换与继承本节主要需要区分的是:基类和派生类的转换;引用(指针)的转换和对象的转换。1.每个派生类对象包含一个基类部分,因此,可以像使用基类对象一样在派生类对象上执行操作。基于这一点,可以将派生类对象的引用(指针)转换为基类子对象的引用(指针),且存在自动转换。反之,基类到派生类的自动转换是不存在的,因此基类不包含派生类型的成员。另外,将基类指针或引用绑定到派生类对象时也存在原创 2016-02-15 20:20:10 · 1180 阅读 · 0 评论 -
C++11 浅谈 右值引用和move语义
一、左值和右值lvalue: 具有存储性质的对象,要实际占用内存空间、内存地址;位于赋值运算符左边时可以赋值(同时也可以用在右边)。rvalue:没有存储性质的对象, 也就是临时对象。位于赋值运算符左边时不可赋值。例子:int a = 10;int b = 20;int *pFlag = &a;vector<int> vctTemp;vctTemp.push_back(1);string原创 2016-01-24 18:49:22 · 2504 阅读 · 1 评论 -
重学C++ (十) OOP面向对象编程(1)
面向对象编程基于三个基本概念:数据抽象、继承和动态绑定。在C++中,用类进行数据抽象,用类派生从一个类继承另一个类:派生类继承基类的成员。动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数。1.多态性仅用于通过继承而相关联的类型的【引用或指针】;2.通过基类的【引用或指针】调用【虚函数】时,发生动态绑定。引用或指针既可以指向基类对象也可以指向派生类对象,调用的虚函数在运行时原创 2016-01-26 11:03:53 · 1213 阅读 · 0 评论 -
重学C++ (九) 重载操作符与转换
1.重载操作符必须具有至少一个类类型或枚举类型的操作数(内置类型的操作符含义不能改变);2.除了函数调用操作符operator()之外,重载操作符时不能使用默认实参;3.重载之后&&, ||不再具备短路求值特征;4.作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数; 一般将算数和关系操作符定义为非成员函数,而将赋值操作符定义为成员://成员函数Sales_item& Sales_原创 2016-01-25 14:50:36 · 1101 阅读 · 0 评论 -
重学C++ (八) 复制控制
1.只有单个形参,且该形参是对本类类型对象的【引用】(常用const修饰),这样的构造函数叫做复制构造函数; (参数必须是引用:否则,在调用复制构造函数之前,需要调用同一个复制构造函数来初始化它自己的参数,造成无限循环调用)2.如果我们没有定义复制构造函数,编译器会为我们合成一个。合成的复制构造函数执行逐个成员初始化,将新对象初始化为原对象的副本(复制数组时,将复制数组的每一个元素;如果类中有指针原创 2016-01-24 16:25:23 · 734 阅读 · 0 评论 -
重学C++ (七) 类 概览
1.类内部定义的函数默认为inline;2.可以声明一个类而不定义它:class Screen; //前向声明,此时Screen是一个不完全类型不完全类型只能以有限方式使用,不能定义该类型的对象,只能定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数;3.因为只有当类定义体完成后才能定义类,所以类不能具有自身类型的数据成员(只能是指向自身类型的指针或引用);原创 2016-01-22 16:55:33 · 761 阅读 · 0 评论 -
重学C++ (六) 标准IO库
1.IO类型在三个独立的头文件中定义: iostream定义读写控制窗口的类型; fstream定义读写已命名文件的类型; sstream定义读写存储在内存中的string对象;2.IO对象不可复制和赋值: a.只有支持复制的元素类型可以存储在vector等容器中,所以流对象不能存储在容器中; b.形参和返回类型不能为流类型,如果需要传递和返回IO对象,必须传递或返回指向该对象的指针或引用原创 2016-01-20 10:39:36 · 762 阅读 · 0 评论 -
重学C++ (五) 函数
第七章 函数1.函数不能返回另一个函数或内置数组类型,但可以返回指向函数的指针,或指向数组元素的指针;2.函数必须指定返回类型;返回类型不是void的函数必须返回一个值,但有一个例外:main函数可以没有返回值就结束(编译器会隐式插入返回0的语句);3.指针形参:void reset (int *ip){ *ip = 0; //改变ip所指对象的值 ip =原创 2016-01-13 15:25:49 · 599 阅读 · 0 评论 -
重学C++ (四) 语句
第六章 语句1.一些看似非法的分号往往只不过是一个空语句而已:ival = v1 = v2;; //ok上面一共两条语句:一条表达式语句和一条空语句;2.对于switch结构,漏写break语句是常见的错误;3.switch求解的表达式可以非常复杂,而case标号必须是整型常量表达式;//非法标号值case 3.14; //非整型case ival; //非常量4.只能在最后一个case标号或d原创 2016-01-12 09:42:26 · 740 阅读 · 0 评论 -
重学C++ (三) 表达式(含sizeof的使用细节)
第五章 表达式1.求余操作符的操作数只能为整型(包括bool,char,short,int,long类型以及对应的unsigned类型);2.逻辑与和逻辑或操作符总是先计算其左操作数,然后再计算右操作。它们的求值策略为“短路求值”——只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数;3.不能串接使用关系操作符,因为关系操作符返回bool类型的结果;(如i < j < k 应写成原创 2016-01-11 21:37:28 · 1402 阅读 · 1 评论 -
重学C++ (二) 数组和指针
第四章 数组和指针1.数组的维数必须用值大于等于1的常量表达式定义,非const常量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数;2.注意下面两种初始化的区别:char c1[] = {'C', '+', '+'}; //末尾没有null,3维char c2[] = "C++"; //末尾有null,4维;char c3[3] = "C++"; //error3.数组下标的原创 2016-01-11 10:27:18 · 856 阅读 · 0 评论 -
重学C++ (一) 变量和基本类型、标准库类型
前言大一的时候我就已经学过C++程序设计了,但是我从来不敢跟别人说我会C++。事实上,平时里大多数时候我用的是C++里面C的部分,偶尔用一下类来封装(其实用struct也可以实现的)。对于C++的特点,我一直没有很好的去学习,只是略知一二,所以在实际使用中常常会出现一些难以察觉的问题。我举个很简单的例子,我们打算输出一个vector内的元素:#include <iostream>#include原创 2016-01-10 18:17:30 · 1482 阅读 · 0 评论