上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 24 下一页

2018年2月26日

非变动性算法源代码分析与使用示例( for_each、min_element 、find_if、search 等)

摘要: 非变动性算法代码分析与示例: 一、for_each C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // TEMPLATE FUNCTION for_each template < class _InIt, class _Fn1 > inline _Fn1 for 阅读全文

posted @ 2018-02-26 08:51 AlanTu 阅读(301) 评论(0) 推荐(0) 编辑

迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员

摘要: 一、迭代器 迭代器是泛型指针 普通指针可以指向内存中的一个地址 迭代器可以指向容器中的一个位置 STL的每一个容器类模版中,都定义了一组对应的迭代器类。使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。 下面来稍微看一下vector<class>::iterator 和 v 阅读全文

posted @ 2018-02-26 08:49 AlanTu 阅读(2085) 评论(0) 推荐(0) 编辑

算法简介、7种算法分类

摘要: 一、算法 算法是以函数模板的形式实现的。常用的算法涉及到比较、交换、查找、搜索、复制、修改、移除、反转、排序、合并等等。 算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用。 算法的优势在于只需实作一份,可以适应所有的容器,不必为每一种容器量订制。也可以与用户定义的容器搭配。 算法 阅读全文

posted @ 2018-02-26 08:49 AlanTu 阅读(4786) 评论(0) 推荐(0) 编辑

实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

摘要: 首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, class _Ax = allocator<_Ty> > class vector; 但在VC2008 中vector 阅读全文

posted @ 2018-02-26 08:47 AlanTu 阅读(801) 评论(0) 推荐(0) 编辑

STL六大组件简介

摘要: 一、STL简介 (一)、泛型程序设计 泛型编程(generic programming) 将程序写得尽可能通用 将算法从数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 (二)、什么是STL 1、STL(Standard Template Library),即标准模板库,是 阅读全文

posted @ 2018-02-26 08:44 AlanTu 阅读(1949) 评论(0) 推荐(0) 编辑

用模板实现单例模式(线程安全)、模板方式实现动态创建对象

摘要: 一、用模板实现单例模式 在前面的文章中,用过多种方法实现单例模式,现在用模板方式来实现: 为了实现线程安全,需要在linux 下使用pthread_mutex_t 加锁,请使用g++ 编译并需要链接 -lpthread 使用的是double-check lock, 指针instance_ 最好声明为 阅读全文

posted @ 2018-02-26 08:43 AlanTu 阅读(998) 评论(0) 推荐(0) 编辑

缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

摘要: 一、缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: template <typename T, typename CONT = std::deque<T> > 阅读全文

posted @ 2018-02-26 08:42 AlanTu 阅读(351) 评论(0) 推荐(0) 编辑

2018年2月25日

类模板、Stack的类模板实现(自定义链栈方式,自定义数组方式)

摘要: 一、类模板 类模板:将类定义中的数据类型参数化 类模板实际上是函数模板的推广,可以用相同的类模板来组建任意类型的对象集合 (一)、类模板的定义 template <类型形参表> class <类名> { //类说明体 }; template <类型形参表> <返回类型> <类名> <类型名表>::< 阅读全文

posted @ 2018-02-25 23:39 AlanTu 阅读(1032) 评论(0) 推荐(0) 编辑

函数模板、函数模板特化、重载函数模板、非模板函数重载

摘要: 一、引子 考虑求两数较大值函数max(a,b) 对于a,b的不同类型,都有相同的处理形式: return a < b ? b : a; 用已有方法解决: (1)宏替换 #define max(a,b) ((a)< (b) ? (b) : (a)) 存在的问题:避开类型检查 (2)重载 存在的问题:需 阅读全文

posted @ 2018-02-25 23:38 AlanTu 阅读(904) 评论(0) 推荐(0) 编辑

输出流格式化(以操纵子方式格式化,以ios类成员函数方式格式化)

摘要: 一、以操纵子方式格式化 数据输入输出的格式控制使用系统头文件<iomanip>中提供的操纵符。把它们作为插入操作符<<的输出对象即可。如setiosflags、setw、setfill、setprecision、hex、oct等。 (一)、常用的流操纵算子: (二)、ios类的枚举常量 C++ Co 阅读全文

posted @ 2018-02-25 23:36 AlanTu 阅读(644) 评论(0) 推荐(0) 编辑

文件的读写、二进制文件的读写、文件随机读写

摘要: 一、文件的读写 如前面所提,流的读写主要有<<, >>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 istream,故操作函数都是一致的。 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 阅读全文

posted @ 2018-02-25 23:35 AlanTu 阅读(2930) 评论(0) 推荐(0) 编辑

文件流(fstream, ifstream, ofstream)的打开关闭、流状态

摘要: 一、文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二、打开文件 说明了流对象之后,可使用函数open()打开文件。文件的打开即是在流与文件之间建立一个连接 函数原型 阅读全文

posted @ 2018-02-25 23:34 AlanTu 阅读(12807) 评论(0) 推荐(0) 编辑

流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作

摘要: 一、IO、流 数据的输入和输出(input/output简写为I/O) 对标准输入设备和标准输出设备的输入输出简称为标准I/O 对在外存磁盘上文件的输入输出简称为文件I/O 对内存中指定的字符串存储空间的输入输出简称为串I/O 数据输入输出的过程,可以形象地看成流 从流中获取数据的操作称为“提取”( 阅读全文

posted @ 2018-02-25 23:32 AlanTu 阅读(656) 评论(0) 推荐(0) 编辑

对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector

摘要: 一、对象语义与值语义 1、值语义是指对象的拷贝与原对象无关。拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝)。比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下的对象 对象拷贝是禁止的(Noncop 阅读全文

posted @ 2018-02-25 23:31 AlanTu 阅读(352) 评论(0) 推荐(0) 编辑

operator new 和 operator delete 实现一个简单内存泄漏跟踪器

摘要: 先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针、当前文件、当前行等信息添加进Trace 成员map容器内,在调用operator delete 的时候删除这些信息。定义一个全局Trace 对象,当程序结束,对象析构时判断成员map 是否还有信 阅读全文

posted @ 2018-02-25 23:28 AlanTu 阅读(358) 评论(0) 推荐(0) 编辑

异常与继承、异常与指针、异常规格说明

摘要: 一、异常与继承 如果异常类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 阅读全文

posted @ 2018-02-25 23:26 AlanTu 阅读(469) 评论(0) 推荐(0) 编辑

程序错误、异常(语法、抛出、捕获、传播)、栈展开

摘要: 一、程序错误 编译错误,即语法错误。程序就无法被生成运行代码。 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数相乘可能溢出 数组越界…… 二、异常 (一)、异常语法 throw 表达式; try { //try 阅读全文

posted @ 2018-02-25 23:25 AlanTu 阅读(1068) 评论(0) 推荐(0) 编辑

C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

摘要: 一、C语言错误处理方法 1、返回值(if … else语句判断错误) 2、errno(linux 系统调用) 3、goto语句(函数内局部跳转) 4、setjmp、longjmp(Do not use setjmp and longjmp in C++ programs; these functio 阅读全文

posted @ 2018-02-25 23:24 AlanTu 阅读(3784) 评论(0) 推荐(0) 编辑

RTTI、dynamic_cast、typeid、类与类之间的关系uml

摘要: 一、RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be determined during program execution. There are three ma 阅读全文

posted @ 2018-02-25 23:22 AlanTu 阅读(362) 评论(0) 推荐(0) 编辑

动态创建对象

摘要: 回顾前面的文章,实现了一个简单工厂模式来创建不同类对象,但由于c++没有类似new "Circle"之类的语法,导致数中需要不断地ifelse地去判断,如果有多个不同类对象需要创建,显然这是很费神的,下面通过宏定义注册的方法来实现动态创建对象 C++ Code 1 2 3 4 5 6 7 8 9 1 阅读全文

posted @ 2018-02-25 23:21 AlanTu 阅读(1750) 评论(0) 推荐(0) 编辑

对C++对象内存模型造成的影响(类/对象的大小)

摘要: 首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(member),#pragma pack(n)所指定的值)的整数倍。 整个结构体也要对齐,结构体总大小对齐至各个min中最大值的整数倍。 win3 阅读全文

posted @ 2018-02-25 23:18 AlanTu 阅读(476) 评论(0) 推荐(0) 编辑

多重继承、虚继承与虚基类

摘要: 一、多重继承 单重继承——一个派生类最多只能有一个基类 多重继承——一个派生类可以有多个基类 class 类名: 继承方式 基类1,继承方式 基类2,…. {….}; 派生类同时继承多个基类的成员,更好的软件重用 可能会有大量的二义性,多个基类中可能包含同名变量或函数 多重继承中解决访问歧义的方法: 阅读全文

posted @ 2018-02-25 23:11 AlanTu 阅读(2002) 评论(0) 推荐(1) 编辑

继承与构造函数、派生类到基类的转换

摘要: 一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。 派生类 阅读全文

posted @ 2018-02-25 23:09 AlanTu 阅读(955) 评论(0) 推荐(0) 编辑

公有/私有/保护继承、overload/overwrite/override之间的区别

摘要: 一、继承 C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。 继承是使用已经编写好的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上作一些修改和增补。 阅读全文

posted @ 2018-02-25 23:08 AlanTu 阅读(647) 评论(0) 推荐(0) 编辑

map 类简介和例程

摘要: 一、标准库的map类型 使用map得包含map类所在的头文件 template < class Key, class Type, class Traits = less<Key>, class Allocator=allocator<pair <const Key, Type> > > class 阅读全文

posted @ 2018-02-25 23:06 AlanTu 阅读(195) 评论(0) 推荐(0) 编辑

vector 类简介和例程

摘要: 一、标准库的vector类型 vector是同一种类型的对象的集合 vector的数据结构很像数组,能非常高效和方便地访问单个元素 vector是一个类模板(class template) vector不能存放引用。 template < class Type, class Allocator = 阅读全文

posted @ 2018-02-25 23:04 AlanTu 阅读(440) 评论(0) 推荐(0) 编辑

string 类简介和例程

摘要: 一、标准库string类型 string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 ,在VC中直接F1查看 template < class CharType, class Traits=char_traits<CharType>, class Al 阅读全文

posted @ 2018-02-25 23:03 AlanTu 阅读(468) 评论(0) 推荐(0) 编辑

类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete

摘要: 一、类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名(); C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #ifndef _INTEGER_H_ 阅读全文

posted @ 2018-02-25 23:01 AlanTu 阅读(382) 评论(0) 推荐(0) 编辑

完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载

摘要: 在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符。 []运算符重载 +运算符重载 +=运算符重载 <<运算符重载 >>运算符重载 String.h: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 阅读全文

posted @ 2018-02-25 23:00 AlanTu 阅读(7558) 评论(0) 推荐(1) 编辑

++运算符重载、!运算符重载、赋值运算符重载

摘要: 一、++运算符重载 前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 后置++运算符重载 成员函数的方式重载,原型为: 函数类型 operator++(int); 阅读全文

posted @ 2018-02-25 22:59 AlanTu 阅读(444) 评论(0) 推荐(0) 编辑

以成员函数方式重载、以友元函数方式重载

摘要: 一、运算符重载 运算符重载允许把标准运算符(如+、-、*、/、<、>等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性 运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式 运算符重载,本质上是函数重载 不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代 阅读全文

posted @ 2018-02-25 22:57 AlanTu 阅读(3113) 评论(0) 推荐(0) 编辑

友元函数和友元类

摘要: 一、友元介绍 我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。 友元是一种允许非类成员函数访问类的非公有成员的一种机制。 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。 友元函数 友元类 二、友元函数 友元函数在类作 阅读全文

posted @ 2018-02-25 22:56 AlanTu 阅读(1102) 评论(0) 推荐(0) 编辑

分别用C和C++来实现一个链栈

摘要: 下面通过分别用C和C++来实现一个链栈(链表实现),从中体会数据封装抽象的思想: C语言实现: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 阅读全文

posted @ 2018-02-25 22:54 AlanTu 阅读(388) 评论(0) 推荐(0) 编辑

static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符

摘要: 一、static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 阅读全文

posted @ 2018-02-25 22:53 AlanTu 阅读(362) 评论(0) 推荐(0) 编辑

四种对象生存期和作用域、static 用法总结

摘要: 一、四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象、静态全局对象 全局对象的构造先于main函数 已初始化的全局变量或静态全局对象存储于.data段中 未初始化的全局变量或静态全局对象存储于.bss段中 静 阅读全文

posted @ 2018-02-25 22:51 AlanTu 阅读(1191) 评论(0) 推荐(0) 编辑

static 成员变量、static 成员函数、类/对象的大小

摘要: 一、static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可以用类的静态成员来解决这个问题。 非static数据成员存在于类类型的每个对象中,stati 阅读全文

posted @ 2018-02-25 22:50 AlanTu 阅读(1864) 评论(0) 推荐(0) 编辑

深拷贝与浅拷贝、空类与空数组

摘要: 一、深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: 浅拷贝造成的问题是有两个指针指向同块内存,delete 其中一个指针,那么剩下的指针将成为野指针。 阅读全文

posted @ 2018-02-25 22:48 AlanTu 阅读(502) 评论(0) 推荐(0) 编辑

初始化列表(const和引用成员)、拷贝构造函数

摘要: 一、构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 阅读全文

posted @ 2018-02-25 22:47 AlanTu 阅读(2794) 评论(0) 推荐(0) 编辑

构造函数、析构函数、赋值与初始化、explicit关键字

摘要: 一、构造函数、默认构造函数 (1)、构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构造函数的类型(返回类型),也不能使用void 通常情况下构造函数应声明为公有函数,一般被隐式地调用。 阅读全文

posted @ 2018-02-25 22:44 AlanTu 阅读(788) 评论(0) 推荐(0) 编辑

类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等

摘要: 一、类声明 //类是一种用户自定义类型,声明形式: class 类名称 { public: 公有成员(外部接口) private: 私有成员 protected: 保护成员 }; 在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。 在关键字private后 阅读全文

posted @ 2018-02-25 22:43 AlanTu 阅读(381) 评论(0) 推荐(0) 编辑

上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 24 下一页

导航