从零开始学C++
文章平均质量分 80
从C到C++,运算符重载,类与对象,继承,多态,虚函数与多态,异常,ios流类库,模板,stl 等。https://github.com/JnuSimba/Calculator
s1mba
这个作者很懒,什么都没留下…
展开
-
虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?
四条基本规则:1、如果基类已经插入了vptr, 则派生类将继承和重用该vptr2、在遇到通过基类指针或引用调用虚函数的语句时,首先根据指针或引用的静态类型来判断所调函数是否属于该class或者它的某个public 基类,如果属于再进行调用语句的改写: C++ Code 1(*(p->_vptr[slotNum]))原创 2013-10-11 21:34:36 · 5573 阅读 · 0 评论 -
从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
一、boost 智能指针智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源。关于RAII的讨论可以参考前面的文章。在使用boost库之前应该先下载后放在某个路径,并在VS 包含目录中添加。下面是boost 库里面的智能指针:二、scoped_ptr先来看例程: C++原创 2013-07-29 17:15:51 · 15506 阅读 · 2 评论 -
从零开始学C++之STL(十一):容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例
一、容器适配器stackqueuepriority_queuestack、queue、priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/deque/list对象创建了一个先进后出容器;queue是用deque或list对象创建了一个先进先出容器;priority_queue是用vector/deque创建了一个排序队列,原创 2013-07-28 10:44:35 · 4826 阅读 · 0 评论 -
从零开始学C++之STL(十):迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}
一、迭代器适配器反向迭代器插入迭代器IO流迭代器其中反向迭代器可以参考以前的文章。二、插入迭代器插入迭代器实际上是一个输出迭代器(*it=; ++)back_insert_iteratorback_inserterfront_insert_iteratorfront_inserter先来看示例:原创 2013-07-27 21:12:22 · 3189 阅读 · 0 评论 -
从零开始学C++之STL(九):函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
一、适配器三种类型的适配器:容器适配器:用来扩展7种基本容器,利用基本容器扩展形成了栈、队列和优先级队列迭代器适配器:(反向迭代器、插入迭代器、IO流迭代器)函数适配器:函数适配器能够将仿函数和另一个仿函数(或某个值、或某个一般函数)结合起来。针对成员函数的函数适配器针对一般函数的函数适配器二、函数适配器示例 C++ Co原创 2013-07-27 17:34:17 · 5329 阅读 · 0 评论 -
从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法
一、函数对象1、函数对象(function object)也称为仿函数(functor)2、一个行为类似函数的对象,它可以没有参数,也可以带有若干参数。3、任何重载了调用运算符operator()的类的对象都满足函数对象的特征4、函数对象可以把它称之为smart function。5、STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算术运算、关系原创 2013-07-26 22:14:33 · 3777 阅读 · 0 评论 -
从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
一、移除性算法 (remove) C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414原创 2013-07-26 13:15:19 · 2975 阅读 · 0 评论 -
从零开始学C++之STL(六):变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)
首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数指针。如果在函数内对容器元素做了修改,那么就属于变动性算法。非变动性算法源代码分析与使用示例:一、copy、copy_backward C++ Code 12345678910原创 2013-07-25 16:55:41 · 3387 阅读 · 0 评论 -
从零开始学C++之STL(五):非变动性算法源代码分析与使用示例( for_each、min_element 、find_if、search 等)
非变动性算法代码分析与示例:一、for_each C++ Code 1234567891011121314// TEMPLATE FUNCTION for_eachtemplate class _InIt, class _Fn1 > inline原创 2013-07-25 11:01:52 · 3363 阅读 · 0 评论 -
从零开始学C++之STL(四):算法简介、7种算法分类
一、算法算法是以函数模板的形式实现的。常用的算法涉及到比较、交换、查找、搜索、复制、修改、移除、反转、排序、合并等等。算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用。算法的优势在于只需实作一份,可以适应所有的容器,不必为每一种容器量订制。也可以与用户定义的容器搭配。算法尾词:_if比如find(按某个值来查找),find_i原创 2013-07-25 09:10:21 · 3949 阅读 · 0 评论 -
从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
一、迭代器迭代器是泛型指针普通指针可以指向内存中的一个地址迭代器可以指向容器中的一个位置STL的每一个容器类模版中,都定义了一组对应的迭代器类。使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。下面来稍微看一下iterator 和 reverse_iterator 的源码: C++ Code原创 2013-07-24 20:18:15 · 14459 阅读 · 1 评论 -
从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 12template class _Ty, class _Ax = allocator >class vector;但在VC2008 中vector 还有基类,如下:原创 2013-07-23 18:23:10 · 6199 阅读 · 2 评论 -
从零开始学C++之STL(一):STL六大组件简介
一、STL简介(一)、泛型程序设计泛型编程(generic programming)将程序写得尽可能通用将算法从数据结构中抽象出来,成为通用的C++的模板为泛型程序设计奠定了关键的基础(二)、什么是STL1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库。2、包含了诸多在计算机科学领域里常用的原创 2013-07-22 21:50:27 · 9372 阅读 · 5 评论 -
从零开始学C++之模板(四):用模板实现单例模式(线程安全)、模板方式实现动态创建对象
一、用模板实现单例模式在前面的文章中,用过多种方法实现单例模式,现在用模板方式来实现:为了实现线程安全,需要在linux 下使用pthread_mutex_t 加锁,请使用g++ 编译并需要链接 -lpthread使用的是double-check lock, 指针instance_ 最好声明为volatile,防止优化。Singleton.h: C++原创 2013-07-21 17:18:30 · 8769 阅读 · 0 评论 -
从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
一、缺省模板参数回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下:template >class Stack{…private: CONT c_;};如果没有传第二个参数,默认为deque 双端队列,当然我们也原创 2013-07-21 15:10:35 · 6710 阅读 · 0 评论 -
从零开始学C++之模板(二):类模板、Stack的类模板实现(自定义链栈方式,自定义数组方式)
一、类模板类模板:将类定义中的数据类型参数化类模板实际上是函数模板的推广,可以用相同的类模板来组建任意类型的对象集合(一)、类模板的定义template class { //类说明体 };template ::(形参表){ //成员函数定义体 }template ::(形参表){ //成员函数定义体原创 2013-07-21 12:49:10 · 9001 阅读 · 1 评论 -
从零开始学C++之模板(一):函数模板、函数模板特化、重载函数模板、非模板函数重载
一、引子考虑求两数较大值函数max(a,b)对于a,b的不同类型,都有相同的处理形式:return a 用已有方法解决:(1)宏替换 #define max(a,b) ((a)存在的问题:避开类型检查(2)重载存在的问题:需要许多重载版本(3)使用函数模板二、模板模板是一种参数化的多态工具所谓参数化的多原创 2013-07-20 20:09:09 · 4356 阅读 · 0 评论 -
从零开始学C++之IO流类库(四):输出流格式化(以操纵子方式格式化,以ios类成员函数方式格式化)
一、以操作子方式格式化数据输入输出的格式控制使用系统头文件中提供的操纵符。把它们作为插入操作符(一)、常用的流操纵算子:(二)、ios类的枚举常量 C++ Code 1234567891011121314151617181920原创 2013-07-20 15:36:22 · 4229 阅读 · 4 评论 -
从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写
一、文件的读写如前面所提,流的读写主要有>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 istream,故操作函数都是一致的。 C++ Code 123456789101112131415161718192原创 2013-07-20 11:04:01 · 8902 阅读 · 0 评论 -
从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态
一、文件流ofstream,由ostream派生而来,用于写文件ifstream,由istream派生而来, 用于读文件fstream,由iostream派生而来,用于读写文件二、打开文件说明了流对象之后,可使用函数open()打开文件。文件的打开即是在流与文件之间建立一个连接函数原型void open(const char * filename,原创 2013-07-19 18:29:02 · 9875 阅读 · 0 评论 -
从零开始学C++之IO流类库(一):流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作
一、IO、流数据的输入和输出(input/output简写为I/O)对标准输入设备和标准输出设备的输入输出简称为标准I/O对在外存磁盘上文件的输入输出简称为文件I/O对内存中指定的字符串存储空间的输入输出简称为串I/O数据输入输出的过程,可以形象地看成流从流中获取数据的操作称为“提取”(输入)操作向流中添加数据的操作称为“插入”(输出)操作标准输入输出流原创 2013-07-19 15:50:23 · 7613 阅读 · 0 评论 -
从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector
一、对象语义与值语义1、值语义是指对象的拷贝与原对象无关。拷贝之后就与原对象脱离关系,彼此独立互不影响。比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义2、对象语义指的是面向对象意义下的对象对象拷贝是禁止的(Noncopyable)。一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享底层资源,对任何一个原创 2013-07-18 20:13:45 · 6515 阅读 · 1 评论 -
从零开始学C++之重载 operator new 和 operator delete 实现一个简单内存泄漏跟踪器
先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针、当前文件、当前行等信息添加进Trace 成员map容器内,在调用operator delete 的时候删除这些信息。定义一个全局Trace 对象,当程序结束,对象析构时判断成员map 是否还有信息,如果有则打印出来,表示已经发生内存泄漏,从输出可以看出是哪一个文件哪一行分配了内存但没有释放掉。原创 2013-07-17 14:44:09 · 3781 阅读 · 2 评论 -
从零开始学C++之异常(三):异常与继承、异常与指针、异常规格说明
一、异常与继承如果异常类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面 C++ Code 12345678910111213141516171819202122232425262728原创 2013-07-16 20:08:30 · 3188 阅读 · 3 评论 -
从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
一、程序错误编译错误,即语法错误。程序就无法被生成运行代码。运行时错误不可预料的逻辑错误可以预料的运行异常例如:动态分配空间时可能不会成功打开文件可能会失败除法运算时分母可能为0整数相乘可能溢出数组越界……二、异常(一)、异常语法throw 表达式;try{原创 2013-07-16 16:49:02 · 3098 阅读 · 0 评论 -
从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
一、C语言错误处理方法1、返回值(if … else语句判断错误)2、errno(linux 系统调用)3、goto语句(函数内局部跳转)4、setjmp、longjmp(这种跳转不会调用对象析构函数,因为对象不能被正常清理)#define _JBLEN 16typedef _JBTYPE jmp_buf[_JBLEN];Saves the curr原创 2013-07-16 15:29:54 · 4509 阅读 · 0 评论 -
从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
一、RTTIRun-time type information (RTTI) is a mechanism that allows the type of an object to be determined during program execution.There are three main C++ language elements to run-time type原创 2013-07-13 20:33:59 · 3224 阅读 · 0 评论 -
从零开始学C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)
首先重新回顾一下关于类/对象大小的计算原则:类大小计算遵循结构体对齐原则第一个数据成员放在offset为0的位置其它成员对齐至min(sizeof(member),#pragma pack(n)所指定的值)的整数倍。整个结构体也要对齐,结构体总大小对齐至各个min中最大值的整数倍。win32 可选的有1, 2, 4,原创 2013-07-13 09:38:11 · 4616 阅读 · 0 评论 -
从零开始学C++之动态创建对象
回顾前面的文章,实现了一个简单工厂模式来创建不同类对象,但由于c++没有类似new "Circle"之类的语法,导致CreateShape 函数中需要不断地ifelse地去判断,如果有多个不同类对象需要创建,显然这是很费神的,下面通过宏定义注册的方法来实现动态创建对象。Shape.h: C++ Code 1234567原创 2013-07-13 15:37:43 · 5325 阅读 · 0 评论 -
从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
一、纯虚函数虚函数是实现多态性的前提需要在基类中定义共同的接口接口要定义为虚函数如果基类的接口没办法实现怎么办?如形状类Shape解决方法将这些接口定义为纯虚函数在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做定义纯虚函数:class 类名{ virtual原创 2013-07-13 11:29:13 · 3573 阅读 · 1 评论 -
从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
一、多态多态性是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。多态的实现:函数重载运算符重载模板虚函数(1)、静态绑定与动态绑定静态绑定绑定过程出现在编译阶段,在编译期就已确定要调用的函数。动态绑定绑定过程工作在程序运行时执行,在程序运行时才确定将要调用的函数。原创 2013-07-13 02:20:44 · 4170 阅读 · 5 评论 -
从零开始学C++之继承(三):多重继承、虚继承与虚基类
一、多重继承单重继承——一个派生类最多只能有一个基类多重继承——一个派生类可以有多个基类class 类名: 继承方式 基类1,继承方式 基类2,…. {….};派生类同时继承多个基类的成员,更好的软件重用可能会有大量的二义性,多个基类中可能包含同名变量或函数多重继承中解决访问歧义的方法:基类名::数据成员名(或成员函数(参数表))明确指明原创 2013-07-12 20:43:32 · 3137 阅读 · 1 评论 -
从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
一、不能自动继承的成员函数构造函数析构函数=运算符二、继承与构造函数基类的构造函数不被继承,派生类中需要声明自己的构造函数。声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化(调用基类构造函数完成)。派生类的构造函数需要给基类的构造函数传递参数 C++ Code 1234原创 2013-07-12 18:11:43 · 3667 阅读 · 1 评论 -
从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别
一、继承C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。继承是使用已经编写好的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上作一些修改和增补。新类称为派生类或子类,原有类称为基类或父类派生类是基类的具体化(一)、原创 2013-07-12 15:38:14 · 4552 阅读 · 6 评论 -
从零开始学C++之标准库类型(三):map 类简介和例程
一、标准库的map类型使用map得包含map类所在的头文件 template < class Key, class Type, class Traits = less, class Allocator=allocator > >class map#include 定义一个map对象: map mapTest;//用st原创 2013-07-11 20:02:24 · 3314 阅读 · 1 评论 -
从零开始学C++之标准库类型(二):vector 类简介和例程
一、标准库的vector类型vector是同一种类型的对象的集合 vector的数据结构很像数组,能非常高效和方便地访问单个元素vector是一个类模板(class template) 要使用vector必须包含相关头文件#include using std::vector; vector对象的初始化:vector类定义了好几种构造函数vec原创 2013-07-11 17:10:33 · 3079 阅读 · 2 评论 -
从零开始学C++之标准库类型(一):string 类简介和例程
一、标准库string类型string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 ,在VC中直接F1查看template < class CharType, class Traits=char_traits, class Allocator=allocator >class basic_string原创 2013-07-11 15:43:28 · 3125 阅读 · 2 评论 -
从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
一、类型转换运算符必须是成员函数,不能是友元函数没有参数不能指定返回类型函数原型:operator 类型名(); C++ Code 1234567891011121314151617181920212223#ifndef原创 2013-07-10 23:43:33 · 4555 阅读 · 3 评论 -
从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符。[]运算符重载+运算符重载+=运算符重载>>运算符重载 C++ Code 1234567891011121314151617181920212223原创 2013-07-10 20:24:57 · 5290 阅读 · 7 评论 -
从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载
一、++运算符重载前置++运算符重载成员函数的方式重载,原型为:函数类型 & operator++();友元函数的方式重载,原型为:friend 函数类型 & operator++(类类型 &);后置++运算符重载成员函数的方式重载,原型为:函数类型 operator++(int);友元函数的方式重载,原型为:friend 函数类型 operat原创 2013-07-10 18:08:01 · 4926 阅读 · 12 评论