摘要:
委托就是把具体事情让别人做,我只调用你的函数。下面是一个例子:class RealSort{public:void sort();};class MySort{private:RealSort rs;public:SetName(RealSort rs){ this->rs = rs;}void sort(){ rs.sort();}};这里MySort将具体事情sort委托给RealSort做。委托的作用在于保持抽象层的稳定,让抽象层不随之细节的变化而变化,也就是你上层的代码如何变化,下层的代码可以维持稳定。就以这个例子来说,开始要求用选择排序,后来老板的要求变了,要用快速排序,那么我 阅读全文
摘要:
重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。以下讨论中将用到的例子: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指向堆中分配的 阅读全文
摘要:
在代理类的帮助下,我们已经可以实现在一个容器里存储一个类层次里所有类型的对象,但是代理有一个很明显的缺点,就是需要复制对象,当一个对象非常大或者是一种不能轻易复制的资源的时候,这个实现遇到了很大的困难,于是我们有了句柄(handle)类这个技术。 我们有这么一个类classpoint{public:point():x_cdt(0),y_cdt(0){}point(intx,inty):x_cdt(x),y_cdt(y){}intget_x(){ returnx_cdt; }intget_y(){returny_cdt; }point&set_x(intx)//返回值是point& 阅读全文
摘要:
指针是 C 与其他语言区别的重要特征之一,在 C++ 中,指针也被广泛运用,我们通过指针实现多态。然而,众所周知,指针的使用必须小心,否则很容易造成内存泄漏 Memory Leak。当我们有几个指针指向同一个对象时有其应该注意,关于何时释放这个对象:(1) 如果释放的太早,那么其它的指针仍然指向这片内存,如果再使用它会造成未定义行为。(2) 如果一直不释放可能会丢失最后一个指向这个对象的指针 导致内存无法被释放。用 C++ 的方法来解决这种问题就是建立一个类来包含需要管理的指针 ,由于这些类往往与被管理者相绑定 ,所以它们被称为 handel 类 ,人们再建立这种 handel 类的同时一般保 阅读全文
摘要:
什么是表驱动 表驱动,又称之为表驱动法、表驱动方法。 “表”是几乎所有数据结构课本都要讨论的非常有用的数据结构。表驱动方法出于特定的目的来使用表,程序员们经常谈到“表驱动”方法,但是课本中却从未提到过什么是"表驱动"方法。表驱动方法是一种使你可以在表中查找信息,而不必用很多的逻辑语句(if或Case)来把它们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,表就变得越来越富有吸引力了,通过下面的这个例子大家就能知道什么是所谓的表驱动方法了。 假设你需要一个可以返回每个月中天数的函数(为简单起见不考虑闰年), 阅读全文
摘要:
原文见:http://hi.baidu.com/dwl_1989/blog/item/5cbad08b212849fbf01f369f.html我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。 iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。 为什么说要扩展才能提供支持呢?我们.. 阅读全文
摘要:
一如果函数对传入的指针参数进行修改,一定要把参数设置为指针的指针或者指针的引用// Delete the first occurrence of the node// which value equals item in a single linked listvoidDelete(Node *head,intitem){if(head->value == item) head = NULL ;}这段代码的问题是,第一个参数是指针类型而head = NULL修改的实际上是这个指针的一个副本(#add 诚然 这段代码仅为了用于防止野指针,因为仅将传入指针置为NULL,而没有去操作指针,显然 阅读全文
摘要:
如果嵌套类型和其外部类型之间的关系需要成员可访问性语义,需要使用C++嵌套类,嵌套类型不应针对其声明类型以外的类型执行任务,而C++局部类允许类、结构和接口被分成多个小块儿并存储在不同的源文件中,这样的实现很容易开发和维护。C++局部类:在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关(#add,这半句是什么屁话?)。局部类不能被外部所继承。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内(#add,因为除此之外没有别的地方可以写定义体)。在实践中,局部类是很少使用的。下面 阅读全文
摘要:
虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要(因为这样只会降低效率和占用更多的空间,实在是一无是处)。 以下面的一个例子为例: #include <iostream.h> #include <memory.h> class CA { int k; //为了便于说明后面的内存结构特别添加 public: void f() {cout << "CA::f" << endl;} }; class CB : public CA { 阅读全文
摘要:
从Trie树(字典树)谈到后缀树作者:July、yansha。出处:http://blog.csdn.net/v_JULY_v。引言 常关注本blog的读者朋友想必看过此篇文章:从B树、B+树、B*树谈到R 树,这次,咱们来讲另外两种树:Tire树与后缀树。不过,在此之前,先来看两个问题。 第一个问题: 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。 之前在此文:海量数据处理面试题集锦与Bit-map详解中给出的参考答案:用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平均长度),然后是找出出现最频繁. 阅读全文