C++
Leone9689
这个作者很懒,什么都没留下…
展开
-
88 boost智能指针(二)
PIMPLPIMPL背后的思想是把客户与所有关于类的私有部分的知识隔离开。避免其它类知道其内部结构 降低编译依赖、提高重编译速度 接口和实现分离 降低模块的耦合度 编译期 运行期 提高了接口的稳定程度 对于库的使用,方法不能改变 对于库的编译,动态库的变更,客户程序不用重新编译原创 2016-04-11 11:27:37 · 281 阅读 · 0 评论 -
23 运算符重载(二)
++运算符重载//Integer.h#ifndef _INTEGER_H_#define _INTEGER_H_class Integer{public: Integer(int n); ~Integer(); Integer& operator++(); //friend Integer& operator++(Integer& i); Integer o原创 2016-03-27 18:01:32 · 238 阅读 · 0 评论 -
15 构造函数与析构函数(五)
深拷贝与浅拷贝原创 2016-03-24 18:19:53 · 205 阅读 · 0 评论 -
76 stl(四)
//ptr_vector.h#ifndef _PTR_VECTOR_H_#define _PTR_VECTOR_H_#include <vector>#include <memory>template <typename T>class ptr_vector :public std::vector<T*>{public: ~ptr_vector() { c原创 2016-04-08 16:36:47 · 235 阅读 · 0 评论 -
22 运算符重载(一)
成员函数与友元函数的运算符重载运算符重载允许把标准运算符(如+、—、*、/、<、>等)应用于自定义数据类型的对象成员函数原型的格式: 函数类型 operator 运算符(参数表); 成员函数定义的格式: 函数类型 类名::operator 运算符(参数表){ 函数体; }友元函数原型的格式: friend 函数类型 operator 运算符原创 2016-03-27 11:56:08 · 217 阅读 · 0 评论 -
72 模板(四)
用模板实现单例模式//Singleton.h#ifndef _SINGLETON_H_#define _SINGLETON_H_#include <cstdlib>#include <iostream>using namespace std;template <typename T>class Singleton{public: static T& GetInstance()原创 2016-04-07 20:38:44 · 232 阅读 · 0 评论 -
71 模板(三)
缺省模板参数template <typename T,typename CONT>=std::vector<T> >class Stack{...}//Stack.h#ifndef _STACK_H_#define _STACK_H_#include <exception>#include <deque>using namespace std;template <typename T原创 2016-04-07 17:54:27 · 419 阅读 · 0 评论 -
21 友元
友元友元是一种允许非类成员函数访问类的非公有成员的一种机制。 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。 友元函数在类作用域外定义,但它需要在类体中进行说明 为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend 类型 友元函数名(参数表); 友元的作用在于提高程序的运行效率#include <math.h>#i原创 2016-03-25 18:06:45 · 451 阅读 · 0 评论 -
19 对象的使用(四)
const 成员函数const int n = 100;//定义常量const Test t(10);const int& ref = n;//const引用int& ref = n; //Errorconst与指针const int*p;//const出现在*左边,表示*p是常量(*p=200;Error)int * const p2;//const出现在*右边,表示p2是常量(p2=&原创 2016-03-25 15:33:44 · 272 阅读 · 0 评论 -
23 运算符重载(二)
++运算符重载前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 后置自增和后置自减的重载 成员函数的方式重载,原型为: 函数类型 & operator++(int); 友元函数的方式重载,原型为:原创 2016-03-28 09:11:29 · 206 阅读 · 0 评论 -
25 运算符重载(四)
类型转换运算符//Integer.h#ifndef _INTEGER_H_#define _INTEGER_H_class Integer{public: Integer(int n); ~Integer(); Integer& operator++(); //friend Integer& operator++(Integer& i); Integer原创 2016-03-28 12:22:28 · 223 阅读 · 0 评论 -
26 string
Stringstring类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 typedef basic_string< char > string; typedef basic_string< wchar_t >wstring; 要使用string类型对象,必须包含相关头文件 include < string > using std::strin原创 2016-03-28 16:34:50 · 286 阅读 · 0 评论 -
87 智能指针(一)
智能指针本质思想: 将堆对象的生存期用栈对象来管理,当new一个堆对象的时候,立刻用智能指针来接管,具体做法是在构造函数进行初始化(用一个指针指向堆对象),在析构函数中调用delete来释放堆对象。 由于智能指针本身是一个栈对象,它的作用域结束的时候,自动调用析构函数,从而调用了delete释放了堆对象。scoped_ptr#include <boost/scoped_ptr.hpp>#inc原创 2016-04-11 08:21:04 · 281 阅读 · 0 评论 -
85 stl(十二)
容器适配器栈#include <iostream>#include <list>#include <stack>using namespace std;int main(void){ stack<int, list<int> >s; for (int i = 0; i < 5; i++) { s.push(i); } /*for (size原创 2016-04-10 19:38:21 · 243 阅读 · 0 评论 -
73 STL(一)
STL六大组件 Container(容器) Adapter(适配器) Algorithm(算法) Iterator(迭代器) Function object(函数对象) Allocator(分配器)七种基本容器: 向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)原创 2016-04-08 11:07:54 · 246 阅读 · 0 评论 -
83 stl(十一)
函数适配器#include <iostream>#include <algorithm>#include <functional>#include <vector>using namespace std;bool is_odd(int n){ return n % 2 ==1;}int main(void){ int a[] = {1,2,3,4,5}; vec原创 2016-04-10 17:35:53 · 232 阅读 · 0 评论 -
29 继承(一)
三种继承方式#include <iostream>using namespace std;class Base{public: int x_;protected: int y_;private: int z_;};class PublicInherit : public Base//公有继承{public: void Test() {原创 2016-03-29 08:53:35 · 257 阅读 · 0 评论 -
82 stl(二)
类函数#include<iostream>using namespace std;class FunObj{public: void operator()() { cout << "hello!" << endl; } void operator()(int n) { cout << "hello2!" << endl;原创 2016-04-10 11:06:04 · 225 阅读 · 0 评论 -
28 map
标准库的map类型使用map得包含map类所在的头文件include < map >定义一个map对象: map#include <map>#include <string>#include <iostream>using namespace std;int main(){ //插入到map容器内部的元素默认是按照key从小到大来排序。 //key类型一定要重载<运算符原创 2016-03-28 20:22:42 · 250 阅读 · 0 评论 -
27 vector
vector对象的初始化vector<T> v1;//vector保存类型为T的对象。默认构造函数v1为空vector<T> v2(v1);//v2是v1的一个副本vector<T> v3(n,i);//v3包含n个值为i的元素vector<T> v4(n);//v4含有值初始化的元素的n个副本原创 2016-03-28 18:05:59 · 252 阅读 · 0 评论 -
18 对象的使用(二)
static与单例模式保证一个类只有一个实例,并提供一个全局访问点#include <iostream>using namespace std;class Singleton{public: static Singleton* GetInstance() { if (instacne_ == NULL) { instacn原创 2016-03-25 12:01:51 · 247 阅读 · 0 评论 -
70 模板(二)
类模板类模板的实例化:用具体的数据类型替换模板的参数以得到具体的类(模板类) 模板类也可以实例化为对象 用下列方式创建类模板的实例: 类名<类型实参表>对象名称;//Stack.h#ifndef _STACK_H_#define _STACK_H_template <typename T>class Stack{public: explicit Stack(int maxSi原创 2016-04-07 11:40:13 · 207 阅读 · 0 评论 -
50 异常(一)
C语言异常处理#include <stdio.h>#include <setjmp.h>jmp_buf buf;//保存一个栈环境double Divide(double a, double b){ if (b == 0.0) { longjmp(buf, 1); //throw } else return a / b;}int原创 2016-04-03 19:57:50 · 286 阅读 · 0 评论 -
41 面向对象版表达式计算器(二)
基于对象编程 值语义 面向对象编程 对象语义值语义对象通常以类对象的方式来使用对象语义对象通常以指针或者引用方式来使用,配合智能指针自动释放对象auto_ptr 所有权独占,不能共享,但是可以转移 shared_ptr 所有权共享,内部维护了一个引用计数 weak_ptr 弱指针,它要与shared_ptr配合使用,循环引用 scoped_ptr 与auto_ptr类似原创 2016-03-31 11:16:51 · 401 阅读 · 0 评论 -
40 面向对象版表达式计算器(一)
#include "Node.h"#include <cmath>#include <iostream>double NumberNode::Calc() const{ return number_;}BinaryNode::~BinaryNode(){ delete left_; delete right_;}double AddNode::Calc() c原创 2016-03-31 11:02:12 · 554 阅读 · 0 评论 -
35 虚函数与多态(二)
纯虚函数虚函数是实现多态性的前提需要在基类中定义共同的接口 接口要定义为虚函数 如果基类的接口没办法实现(如形状类Shape) 解决办法 将这些接口定义为纯虚函数定义纯虚函数: class 类名{ virtual 返回值类型 函数名(参数表)=0; };纯虚函数不需要实现原创 2016-03-30 12:04:37 · 251 阅读 · 0 评论 -
34 虚函数与多态(一)
静态绑定与动态绑定静态绑定 绑定过程出现在编译阶段,在编译期就已确定要调用的函数。 动态绑定 绑定过程工作在程序运行时执行,在程序运行时才确定将要调用的函数。 只有通过基类指针或引用调用虚函数才能引发动态绑定#include <iostream>using namespace std;class Base{public: virtual void Fun1() {原创 2016-03-30 11:26:13 · 231 阅读 · 0 评论 -
33 继承(五)
类/对象大小计算#include <iostream>using namespace std;class BB{public: int bb_;};class B1 :virtual public BB{public: int b1_;};class B2 :virtual public BB{public: int b2_;};class DD :publ原创 2016-03-29 19:59:56 · 218 阅读 · 0 评论 -
32 继承(三)
多重继承#include <iostream>using namespace std;class Furniture{public: Furniture(int weight) : weight_(weight) { cout << "Furniture ..." << endl; } ~Furniture() { cou原创 2016-03-29 17:34:35 · 242 阅读 · 0 评论 -
31 继承(三)
派生类到基类的转换1.当派生类以public方式继承基类时,编译器可自动执行的转换(向上转型upcasting安全转换) 派生类对象指针自动转化为基类对象指针 派生类对象引用自动转化为基类对象引用 派生类对象自动转换为基类对象(特有成员消失) 2.当派生类以private/protected方式继承基类时 派生类对象指针(引用)转化为基类对象指针(引用)需用原创 2016-03-29 15:34:03 · 260 阅读 · 0 评论 -
51 异常(二)
#include <iostream>#include <string>using namespace std;class MyException{public: MyException(const char* message) :message_(message) { cout << "MyException ..." << endl;原创 2016-04-03 20:41:50 · 282 阅读 · 0 评论 -
54 跟踪内存泄漏
自己实现malloc,在里面进行跟踪 valgrind、dmalloc、efence (linux) visual leak detector(windows)operator new operator deletenew operator <=>operator new + 构造函数头文件包含次序 C库、C++库、其他库.h 、项目中.h//Tracer.h#ifndef _TRACER原创 2016-04-04 16:20:46 · 329 阅读 · 1 评论 -
56 RAII实现智能指针
空悬指针 内存泄漏 重复释放//Node.h#ifndef _NODE_H_#define _NODE_H_class Node{public: Node(); ~Node(); void Calc() const;};class NodePtr{public: explicit NodePtr(Node* ptr = 0) :pt原创 2016-04-05 12:07:00 · 245 阅读 · 0 评论 -
17 对象的使用(二)
作用域与生存期#include <iostream>using namespace std;class Test{public: Test(int n) : n_(n) { cout<<"Test "<<n_<<" ..."<<endl; } ~Test() { cout<<"~Test "<<n_<<" ..."<<en原创 2016-03-24 21:28:43 · 254 阅读 · 0 评论 -
69 模板(一)
//max.h#ifndef _MAX_H_#define _MAX_H_template <typename T>const T& max(const T& a, const T& b)//必须将实现放在头文件{ return a < b ? b : a;}//函数模板重载template <typename T>const T& max(const T& a, const原创 2016-04-07 09:58:07 · 470 阅读 · 0 评论 -
16 对象的使用(一)
static成员对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来解决这个问题。非static数据成员存在于类类型的每个对象中(每个对象都有非stacic数据的拷贝,是独立的),static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类原创 2016-03-24 20:26:11 · 304 阅读 · 0 评论 -
14 构造函数与析构函数(四)
拷贝构造函数拷贝构造函数 功能:使用一个已经存在的对象来初始化一个新的同一类型的对象。 声明:只有一个参数并且参数为该类对象的引用 如果类中没有说明拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类的公有成员。//Test.h#ifndef _TEST_H_#define _TEST_H_class Test{public: Test(); Test(const原创 2016-03-24 11:57:26 · 337 阅读 · 1 评论 -
13 构造函数与析构函数(三)
const成员、引用成员的初始化#include <iostream>using namespace std;// const成员的初始化只能在构造函数初始化列表中进行// 引用成员的初始化也只能在构造函数初始化列表中进行// 对象成员(对象所对应的类没有默认构造函数)的初始化,也只能在构造函数初始化列表中进行class Object{public: enum E_TYPE原创 2016-03-24 11:53:51 · 252 阅读 · 0 评论 -
60 IO流类库(二)
文件流ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来,用于读文件 fstream,由iostream派生而来,用于读写文件#include <cassert>#include<iostream>#include <fstream>using namespace std;int main(void){ ofstream fout;原创 2016-04-06 10:27:30 · 311 阅读 · 0 评论 -
59 io流类库(一)
继承关系原创 2016-04-06 09:55:06 · 302 阅读 · 0 评论