模板的一些高级主题
摘要:十一、模板与继承1、当从模板类派生出子类时必须注意的是:子类并不会从通用的模板基类继承而来,只能从基类的某一实例继承而来。这样的话就有以下几种继承方式:a、基类是模板类的一个特定实例版本,比如template<class T> class B : public A<int>{};b、基类是一个和子类相关的一个实例,比如template<class T> class B : public A<T>{};这时当实例化一个子类B的时候,基类就相应的被实例化为一个和子类相同的实例版本,比如B<int> m;模板类B被实例化为int 版本,这时
阅读全文
posted @
2011-08-26 14:24
maxweii
阅读(399)
推荐(0)
C++局部类和嵌套类
摘要:如果嵌套类型和其外部类型之间的关系需要成员可访问性语义,需要使用C++嵌套类,嵌套类型不应针对其声明类型以外的类型执行任务,而C++局部类允许类、结构和接口被分成多个小块儿并存储在不同的源文件中,这样的实现很容易开发和维护。 C++局部类:在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关(#add,这半句是什么屁话?)。局部类不能被外部所继承。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内(#add,因为除此之外没有别的地方可以写定义体)。在实践中,局部类是很少使用的。下
阅读全文
posted @
2011-08-12 13:25
maxweii
阅读(497)
推荐(0)
C++ 常用技巧
摘要:一 如果函数对传入的指针参数进行修改,一定要把参数设置为指针的指针或者指针的引用// Delete the first occurrence of the node// which value equals item in a single linked listvoid Delete(Node *head, int item){ if(head->value == item) head = NULL ;}这段代码的问题是,第一个参数是指针类型而head = NULL 修改的实际上是这个指针的一个副本(#add 诚然 这段代码仅为了用于防止野指针,因为仅将传入指针置为NULL,而没有去操
阅读全文
posted @
2011-06-27 11:07
maxweii
阅读(337)
推荐(0)
c++ io标准库
摘要:我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。 iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。 为什么说要扩展才能提供支持呢?我们来一个示例。#include <stdio.h> #include <iostream> using namespace s
阅读全文
posted @
2011-06-10 15:48
maxweii
阅读(420)
推荐(0)
表驱动法介绍
摘要:一,什么是表驱动 表驱动,又称之为表驱动法、表驱动方法。 “表”是几乎所有数据结构课本都要讨论的非常有用的数据结构。表驱动方法出于特定的目的来使用表,程序员们经常谈到“表驱动”方法,但是课本中却从未提到过什么是"表驱动"方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,表就变得越来越富有吸引力了,通过下面的这个例子大家就能知道什么是所谓的表驱动方法了。 假设你需要一个可以返回每个月中天数的函数(为简单起见不考虑闰年)
阅读全文
posted @
2011-06-01 14:32
maxweii
阅读(498)
推荐(0)
C++中代理类和句柄类
摘要:指针是 C 与其他语言区别的重要特征之一,在 C++ 中,指针也被广泛运用,我们通过指针实现多态。然而,众所周知,指针的使用必须小心,否则很容易造成内存泄漏 Memory Leak。当我们有几个指针指向同一个对象时有其应该注意,关于何时释放这个对象:(1) 如果释放的太早,那么其它的指针仍然指向这片内存,如果再使用它会造成未定义行为。(2) 如果一直不释放可能会丢失最后一个指向这个对象的指针 导致内存无法被释放。 用 C++ 的方法来解决这种问题就是建立一个类来包含需要管理的指针 ,由于这些类往往与被管理者相绑定 ,所以它们被称为 handel 类 ,人们再建立这种 handel 类的同时一般
阅读全文
posted @
2011-05-27 00:07
maxweii
阅读(417)
推荐(0)
理解句柄类
摘要:一: 在代理类的帮助下,我们已经可以实现在一个容器里存储一个类层次里所有类型的对象,但是代理有一个很明显的缺点,就是需要复制对象,当一个对象非常大或者是一种不能轻易复制的资源的时候,这个实现遇到了很大的困难,于是我们有了句柄(handle)类这个技术。 我们有这么一个类class point{public:point():x_cdt(0),y_cdt(0){}point(int x,int y):x_cdt(x),y_cdt(y){}int get_x(){ return x_cdt; }int get_y(){ return y_cdt; }point& set_x(int x)//
阅读全文
posted @
2011-05-26 23:56
maxweii
阅读(513)
推荐(0)
关于拷贝构造函数和赋值运算符
摘要:重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。以下讨论中将用到的例子:class CExample{public: CExample(){pBuffer = NULL; nSize = 0;} ~CExample(){delete pBuffer;} void Init(int n){ pBuffer = new char[n]; nSize = n;}private: char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源 int nSize;};这个类的主要特点是包含指向其他资源的指针。pBuffer指向堆中分配的一段内存
阅读全文
posted @
2011-05-26 14:43
maxweii
阅读(384)
推荐(0)
C++委托简介
摘要:委托就是把具体事情让别人做,我只调用你的函数。下面是一个例子:class RealSort{public:void sort();};class MySort{private:RealSort rs;public:SetName(RealSort rs){ this->rs = rs;}void sort(){ rs.sort();}};这里MySort将具体事情sort委托给RealSort做。委托的作用在于保持抽象层的稳定,让抽象层不随之细节的变化而变化,也就是你上层的代码如何变化,下层的代码可以维持稳定。就以这个例子来说,开始要求用选择排序,后来老板的要求变了,要用快速排序,那么我
阅读全文
posted @
2011-05-23 10:16
maxweii
阅读(525)
推荐(0)
private的虚函数
摘要:3.1 private的虚函数 考虑下面的例子:class A{public:void foo() { bar();}private:virtual void bar() { ...}};class B: public A{private:virtual void bar() { ...}}; 在这个例子中,虽然bar()在A类中是private的,但是仍然可以出现在派生类中,并仍然可以与public或者protected的虚函数一样产生多态的效果。并不会因为它是private的,就发生A::foo()不能访问B::bar()的情况,也不会发生B::bar()对A::bar()的overrid
阅读全文
posted @
2011-05-19 11:24
maxweii
阅读(555)
推荐(0)
C++的 RTTI 概念和用途
摘要:自从1993年Bjarne Stroustrup 〔注1 〕提出有关C++ 的RTTI功能之建议﹐以及C++的异常处理(exception handling)需要RTTI;最近新推出的C++ 或多或少已提供RTTI。 然而,若不小心使用RTTI,可能会导致软件弹性的降低。本文将介绍RTTI的观念和近况﹐并说明如何善用它。 什么是RTTI? 在C++ 环境中﹐头文件(header file) 含有类之定义(class definition)亦即包含有关类的结构资料(representational information)。但是﹐这些资料只供编译器(compiler)使用﹐编译完毕后并未留下来.
阅读全文
posted @
2011-05-11 23:15
maxweii
阅读(683)
推荐(0)
C++ 常见编译错误解决办法
摘要:“default”标签跳过“ ”的初始化操作问题解决:原因是在switch中有初始化的工作。在switch语句中不可以有定义部分。如果有定义,如初始化的时候,必须把定义部分需要用{ }括起来。
阅读全文
posted @
2011-04-25 10:50
maxweii
阅读(553)
推荐(0)
深入理解C++中的mutable关键字
摘要:mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 他只能用于类的非静态和非常量数据成员 我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化! 如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用到mutable关键字了 .
阅读全文
posted @
2011-04-21 11:19
maxweii
阅读(334)
推荐(0)
c++关键字详解(volatile, mutable, explicit, dynamic_ cast<T>(expression))等
摘要:1 volatile有些变量是用volatile关键字声明的。当两个线程都要用到某一个变量且该变量的值会被改变时,应该用volatile声明,该关键字的作用是防止优化编译器把变量从内存装入CPU寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。 volatile的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值,如下: volatile BOOL bStop = FALSE; 在一个线程中: while( !bStop ) { ... } bStop = FALSE; return; 在另
阅读全文
posted @
2011-04-21 11:12
maxweii
阅读(506)
推荐(0)
可重入函数
摘要:可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。可重入函数简介 也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,
阅读全文
posted @
2011-04-14 23:54
maxweii
阅读(846)
推荐(1)
指向类成员的指针
摘要:指向类成员的指针,印象中似乎很少用到,重新学习C++的过程中,才发现自己是忽视了一个很重要的东东,以前我一直认为类的成员函数不能作为回调函数,所以很多C程序都始终无法移植到C++上来,现在才知道,这是对指向类成员的指针不了解的缘故。 1、指向非静态成员的指针 其实指向非静态的类成员的指针很容易,它们与普通指针唯一的区别是,他们受类的限制。如下: class A { int _val; int val(); }; int (A::*p_val) = &A::_val; int ( A::*p_func )() = &A::val; 看到了吗,是的,和普通的指针的区别是,指向类成员
阅读全文
posted @
2011-03-22 14:01
maxweii
阅读(629)
推荐(1)
MSXML使用教程
摘要:VC++中利用MSXML解析XML文档一、XML 简介 XML(Xtensible Markup Language,即扩展标记语言)的发展起源于1996年。当时,出版界巨头和Web业内人士经过共同讨论,提出了创建SGML(Standard Generalized Markup Language,即标准通用标识语言)子集(HML)的建议。该子集专用于Web,具有可扩展(或可扩充)性,并且能利用结构化标记语言的所有高级功 能,但摒弃了SGML的复杂性。XML规范的第一份草稿于1996年11月发布后不久,1997年1月首个XML解析器就面世了。随后,便出现了XML的 应用以及新的规范和解析器。HTM
阅读全文
posted @
2011-03-17 22:41
maxweii
阅读(7995)
推荐(0)
VS的__try,__except,__finally,__leave异常模型机制
摘要:导读: 从本篇文章开始,将全面阐述__try,__except,__finally,__leave异常模型机制,它也即是Windows系列操作系统平台上提供的SEH模型。主人公阿愚将在这里与大家分享SEH( 结构化异常处理)的学习过程和经验总结。 深入理解请参阅<<windows 核心编程>>第23, 24章.SEH实际包含两个主要功能:结束处理(termination handling)和异常处理(exception handling)每当你建立一个try块,它必须跟随一个finally块或一个except块。一个try 块之后不能既有finally块又有except
阅读全文
posted @
2011-03-17 10:08
maxweii
阅读(1139)
推荐(0)
do...while(0)的妙用
摘要:在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。 1. do...while(0)消除goto语句。通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样:version 1boolExecute(){//分配资源int*p=newint;boolbOk(
阅读全文
posted @
2011-03-16 10:25
maxweii
阅读(269)
推荐(0)
ctype.h里的函数大全
摘要:1 字符测试函数 1 函数原型均为int isxxxx(int) 2 参数为int, 任何实参均被提升成整型 3 只能正确处理处于[0, 127]之间的值 2 字符映射函数 1 函数原型为int toxxxx(int) 2 对参数进行检测, 若符合范围则转换, 否则不变 int tolower(int); 'A'~'Z' == 'a'~'z' int toupper(int); 'a'~'z' == 'A'~'Z' @函数名称: isalpha 函数原型: int isalpha(int ch); 函数功能: 检查ch是否是字母.
阅读全文
posted @
2011-01-29 10:11
maxweii
阅读(614)
推荐(0)