Windows 程序设计学习记录(3)---类模板、重载
1、什么是类模板??它有什么用????有什么缺点????
(1)类模板是一个类家族的抽象,它只是对类的描述,编译程序不为类模板(包括成员函数定义)创建程序代码,但是通过对类模板的实例化可以生成一个具体的类以及该具体类的对象。(引用百度百科)
(2)当我们建立一个类时,我们一般对类中成员变量和成员函数的形参和返回值都定义了类型,有int,char,float,指针或者是void空类型,如果我们在类的实例化时需要
处理不同的数据类型,那么我们可能是想到重写类中成员变量和成员函数,重新定义类型,这样实在是太麻烦了!!!于是我们有了类模板这个朋友,我们可以为我们定义的类写一个类模板,我们可以在类模板中重载先前定义的类中的函数,实例化时,就可以生成一批仅仅成员数据类型不同的类。这样可以大大减少开发时间,提高生产效率。
(3)至于用类模板有什么缺点呢?这里有个文章,英文的,也附带了部分中文翻译,非常不错。http://www.chineselinuxuniversity.net/articles/47864.shtml。总的来说,就是我们的类模板是定义在头文件中的,编译器在编译时会生成额外的代码,过多地用类模板会造成代码膨胀,生成的可执行文件也会很大;同时,如果类模板有任何变化,需要重编译所有相关工程文件。
//CSimpleList类模板 template<class TYPE> class CTypedSimpleList : public CSimpleList { public: CTypedSimpleList( int nNextOffset = 0) :CSimpleList(nNextOffset) {} void AddHead(TYPE p) { return (TYPE)CSimpleList::AddHead((void*)p); } TYPE GetHead() { return (TYPE)CSimpleList::GetHead(); } TYPE GetNext(TYPE p) { return (TYPE)CSimpleList::GetNext(p); } BOOL Remove(TYPE p) { return CSimpleList::Remove(p); } operator TYPE() { return (TYPE)CSimpleList::GetHead(); } }
2、什么是重载啊???(上面的叙述中出现过)他与多态有什么关系??
http://zhidao.baidu.com/question/5790744.html 这个解析可以。
重载有函数重载,流重载和运算符的重载之分。
对于函数的重载,可以这样理解,它与原函数有同样的名字,但是有不同的参数表,通过识别这个参数表来确定你是要调用哪个函数。
对于多态,它是通过函数的类型来判断要调用哪个函数的。(这里面有好多延伸知识,有空还要好好学习,现在要做正事)
3、那什么又是虚函数???(学习就是这样,总是由一个问题引出另一个问题,感觉没完没了的,但是当有一天我们突然把这些知识点串起来后,一切都明了了!至少我是这么认为的)
http://www.dzsc.com/data/html/2010-5-20/83289.html
这里不多说了,有空再研究研究
4、现在重新回到我们类模板,在上面的程序代码中,有这样一句:
operator TYPE() { return (TYPE)CSimpleList::GetHead(); }
这句是重载TYPE的运算符,这中运算符重载比较独特,不需要返回值,为什么直接引用类的对象是会调用此函数呢??operator TYPE()是类CTypedSimpleList的成员函数,我的理解是,这个是对空符号进行重载,那么如果直接应用类的对象时,相当于调用了这个空符号。且看下面的例子:
MyThreadData* pData; CTypedSimpleList<MyThreadData*> list; list.Construct(offsetof(MyThreadData, pNext)); //向链表中添加成员 for( int i = 0;i<10;i++) { pData = new MyThreadData; pData->nSomeData = i; list.AddHead(pData); } //...... ........ //使用链表中的数据 //遍历整个链表,释放MyThreadData对象占用的空间 pData =list; while(pData != NULL) { MyThreadData* pNextData = pData->pNext; printf( "The value of nSomeData is: %d \n",pData->nSomeData); delete pData; pData = pNextData; }