C++程序设计2(侯捷video all)】的更多相关文章

一.转换函数Conversion function(video2) 一个类型的对象,使用转换函数可以转换为另一种类型的对象. 例如一个分数,理应该可以转换为一个double数,我们用以下转换函数来实现: class Fraction { public: //构造函数,输入分子和分母 Fraction() :m_num(num), m_den(den) {} //转换函数,不需要返回值,因为定义的就是转为double的函数,返回值是固定的 //因为该函数并未修改m_num和m_den的值,所以加上…
一.头文件的防御式声明(video2) #ifndef __COMPLEX__ #define __COMPLEX__ //内容 #endif 二.初步感受模板(video2) 定义的时候: //复数的实部和虚部可能是int,float等不同类型,使用模板来统一兼容他们 template <typename T> class Complex{ public: Complex(T re, T im) {} private: T re, im; }; 使用的时候: Complex<, );…
 一.Big three(拷贝构造.拷贝赋值.析构函数)(video7) Big three指三个特殊函数,分别是拷贝构造函数.拷贝赋值和析构函数. 什么时候需要拷贝构造.拷贝赋值.析构函数: 当类中的数据是指针时,例如string类中保存字符串使用char *,那么就不能直接使用编译器给的默认Big three.因为默认的函数是按字节拷贝的,这样拷贝后的对象中的指针指向的位置和被拷贝的对象一样,这样不是真正的拷贝. class mystring { public: //普通构造函数 mystr…
一.OOP和GP的区别(video7) OOP:面向对象编程(Object-Oriented programming) GP:泛化编程(Generic programming) 对于OOP来说,我们要实现容器,应该是这样的: 将数据和方法关联在一起,例如排序,用成员方法的方式将其放在容器类中. 对于GP来说,我们将数据和方法分开: 如图中所示,左边是容器的定义,而右边是sort算法的定义.我们用::sort(c.begin(),c.end())就可以调用全局的sort算法,参数代表数据的存放范围…
与我研究VCL框架代码的原因一模一样:就是N年了,感觉自己还是没有掌握Delphi,惊叹别人各种各样神奇的效果,自己却不会,更不知为什么这样做,离高手的距离还有十万八千里.而且编程的时候,就像侯捷说的那样:自己只是像傻子一样地东一个按钮,西一个按钮,东编一点码,西编一点码,很愚蠢,却又不得不这样做. 最近仔细看了VCL代码,才算大致明白了为什么要这样做,而且还没全明白.即使简单如Label1.Caption:='Hello World';或者Button1.Caption:='Hello But…
泛型編程編出來的代碼,適用於任何「吻合某種條件限制」的資料型別.這已成為撰寫可復用代碼時的一個重要選擇.然而,總有一些時候,泛型不夠好 — 有時候是因為不同的型別差距過大,難以產生一致的泛化實作版本.這個時候 traits(品质,特性意思) 技術就變得相當重要.這種技術可以將那些需要被納入考量的型別性質以一種 type by type 的原則,封裝於一個 traits class 內,於是可以將「由於型別之間的差異,必須撰寫出來以備用」的代碼體積降至最低,並使泛用代碼的體積提昇到最高. 考慮一個…
侯捷的<深入浅出mfc>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了. 而李久进的<mfc深入浅出>,听说的人可能就少得多.原因听说是这本书当时没有怎么宣传,而自从1999年第1版后,似乎也没有重印过,现在市面上根本找不到,所以大部分人都不知道.我手里现在恰好有一本,是从图书馆借的.这本书全名为<mfc深入浅出——从mfc设计到mfc编程>李久进编著,华中理工大学出版.此书极佳! 我这本书是1999年9月第一版,印数居然只有5000册.这么好的书只印50…
开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 三个网站 CPlusPlus CppReference gcc.gnu.org Boost 第二节:STL六大部件 迭代器将容器和算法结合起来 分配器实现,适配器用的地方很多 实例: 理解容器的前闭后开的设计.迭代器类似于指针,很多操作和指针差不多++,--运算.vec.begin(),vec.end()指向…
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort transfer list内部提供一个所…
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort list概述 list相对于vector…
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort list的push_back.inser…
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL源码--侯捷):push_front.push_back.erase.pop_front.pop_back.clear.remove.unique list源码4(参考STL源码--侯捷):transfer.splice.merge.reverse.sort push_front() //插入一个节…
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷):空间分配.push_back vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源码--侯捷):pop_back.erase.clear.insert pop_back //删除尾部元素,调整大小 void pop_back(){ --finish; //尾端标记往前一格,表示放弃尾部元素 destroy(finish); } erase //清除(…
一.容器概览 上图为 GI STL 2.9的各种容器.图中以内缩方式来表达基层与衍生层的关系.所谓的衍生,并非继承(inheritance)关系,而是内含(containment)关系.例如 heap 内含一个 vector,priority-queue 内含一个 heap,stack  和 queue 都含一个 deque,set/map/multiset/multimap 都内含一个 RB-tree,hast_x都内含一个 hashtable. 二.序列式容器(sequential cont…
以STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作默默付出. 一.分配器测试 测试代码 #include <list> #include <stdexcept> #include <string> #include <cstdlib> //abort() #include <cstdio> //snprintf() #include <algorithm&…
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源码--侯捷):pop_back.erase.clear.insert #include<bits/stdc++.h> using namespace std; int main(){ vector<,); vector<int>::iterator it=v.begin(); c…
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源码--侯捷):pop_back.erase.clear.insert vector的构造和内存管理 vector所采用的数据结构非常简单:线性连续空间,它是由两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备…
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源码--侯捷):pop_back.erase.clear.insert vector概述 Vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间纳入新元素,vector的使用效率,关键在于其对大小的控制以及重新配置时的元素迁移效率. Vector定义摘要 template <class T…
layout: post title: 侯捷STL学习(12) date: 2017-08-01 tag: 侯捷STL --- 第四讲 STL相关的内容 Hash Function 将hash函数封装成类对象 hash_val进行拆解传入参数,进行循环 每次拆解一个参数,都需要更新种子 TR1的工具,)0x9e3779b9是黄金比例数字0.618 测试 当没有指定hash函数时,用默认的hash函数,但是针对特殊的类型,有自己特化的hash函数 tuple用例 测试 实现,递归的继承实现自动添加…
layout: post title: 侯捷STL学习(十一) date: 2017-07-24 tag: 侯捷STL --- 第三讲 标准库内核分析-算法 标准库算法形式 iterator分类 不同容器iterator类型不同 测试iterator类型 #include <iostream> // std::cout #include <iterator> // std::iterator_traits #include <typeinfo> // typeid na…
layout: post title: 侯捷STL学习(十) date: 2017-07-23 tag: 侯捷STL --- 第二十三节 容器hashtable探索 hashtable冲突(碰撞)处理 rehash时,篮子扩充两倍,找到其附近的质数,重新计算元素位置 内部扩充的数据已经预定好,53->97->.... hashtable实现 iterator要实现当当前node链表结束,要能进入到下一个buckets hashtable使用 模板参数的形式 容器hashtable中hashfu…
layout: post title: 侯捷STL学习(九) date: 2017-07-21 tag: 侯捷STL --- 第十九节 容器rb_tree Red-Black tree是自平衡二叉搜索树. rb_tree的封装 清楚传入模板的参数列表:然后构建了一个虚空结点header KeyOfValue表示怎么从value中取出key identity函数(Gnu C独有)就是表示同一个数的意思 handle-body,采用OOP的思想,构建G4.9 一个红黑树的大小为4个字节 test R…
layout: post title: 侯捷STL学习(八) date: 2017-07-19 tag: 侯捷STL --- 第十八节 深度探索deque上 duque内存结构 分段连续,用户看起来是连续的 迭代器为了维持连续的状态,每次++,--都需要判断当前buffer是否用完,若用完则需要通过控制中心跳到下一个buffer 控制中心的map是指向vector的,以后也是2倍增长 deque iterator迭代器实现,关键有指向map的指针 deque<T>::insert讲解 很好体现…
layout: post title: 侯捷STL学习(七) date: 2017-06-13 tag: 侯捷STL --- 第十六节 深度探索vector vector源码剖析 vector内存2倍扩充,是在另外的地方重新申请内存,将数据搬过去 前闭后开区间 2倍扩充方法,reallocation insert_aux函数中再次判断,原因是可能有其他放元素的操作如insert 也要拷贝插入之后的数据,考虑到insert插入某个位置,红色框部分 vector's iterator vector结…
开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 三个网站 CPlusPlus CppReference gcc.gnu.org Boost 第二节:STL六大部件 迭代器将容器和算法结合起来 分配器实现,适配器用的地方很多 实例: 理解容器的前闭后开的设计.迭代器类似于指针,很多操作和指针差不多++,--运算.vec.begin(),vec.end()指向…
前言 最近在看侯捷的一套课程<C++面向对象开发>,刚看完第一节introduction之后就被疯狂圈粉.感觉侯捷所提及所重视的部分也正是我一知半解的知识盲区,我之前也写过一些C++面向对象的程序,不过正如侯捷所说,我还仅仅停留于Object-based层面,写程序时总是在想如何封装好一个类,而不是Object-oriented强调类与类之间关系的设计. 这门课程分为两部分,第一部分讲Object-based,第二部分讲Object-oriented:第一部分又分为两部分:带指针的类的封装和不…
题外话:侯捷老师难得一年就来上九堂课就要会宝岛,特此留念签名赠语及合照以自勉.  学海无涯,为勤是岸 <正文开始> 昨天晚上连上了3个小时的大课探究单单讲了Adapter一个类,幸运的是本人恰好在大一的时候接触过比如<functioinal>库类中的bind1st,bind2nd这些函数对象的使用方法,毕竟若要使用<algorithm>的话,里面几乎每一个函数都需要我们把模版中的函数对象比如Comparato之类的重写一下,但是真的没有想到,这些库这些类使用起来明明那么…
摘要: 本文簡介 C++ Object Model 和 Component Object Model 的基本概念,並引介四本書籍: 1. Inside The C++ Object Model 2. Essential COM 3. Inside COM 4. Understanding ActiveX and OLE -- A Guide for Developers & Managers 將近 8 年的時間,我把自己放逐在 Windows 領域裡,縱情學習與研究.我應該算是幸運的一群人之一,…
基础知识 基于对象:Object Based 面对的是单一class的设计. 面向对象:Object Oriented 面对的是多重classes的设计,涉及到类和类之间的关系. 课程中设计到两种不同类设计:没有指针(成员变量)的类和带指针(成员变量)的类设计. 头文件一般采用h结尾,源文件一般采用cpp,但是也不一定!(如stl很多没有后缀名) 头文件采用防御式声明,采用 #ifndef *** #define *** #endif,避免多次引用. 注意声明文件的内容顺序,一般是前置声明.类声…
[自序]虑而後能得(自序)故事接触 C++ 大约是 1989 年的事.那时候的 PC 以现在的眼光看,除了「蛮荒」之外没有更合适的形容词了.横扫千军的 Windows 3.0 还没有诞生,如今以 C++ 编译器技术闻名於世的 Borland 公司那个时候也还没有踏进 C++ 领域,遑论动作更慢的 Microsoft.当时我用的编译器是 Zortech C++.将近 10 年的历史,并不表示我在 C++ 技术上就怎麽地超凡入圣了.事实上初期我很排斥这个语言.我没有用心去体会,也就看不到其中的美好.…