基于对象的程序设计雷小锋13685124458leiyunhui@gmail.com内容纲要一、基于对象的程序设计概述二、类和对象三、重载操作符四、类模板五、数组和指针四、类模板类型参数化的程序设计将数据类型泛化为一个设计参数,形成更为通用的代码,即类型参数化的程序设计通过函数模板可以编写类型通用的函数问题:能否编写类型通用的类呢?类模板(classtemplate)template模板参数表class类名{……//类定义体,数据成员和成员函数};//分号template模板参数表返回类型类名模板参数名表::成员函数名1(形参表){……;//成员函数1定义体}……template模板参数表返回类型类名模板参数名表::成员函数名n(形参表){……;//成员函数n定义体}四、类模板模板参数有两种:模板类型参数class类型名或者:typename类型名模板非类型参数:普通的参数声明,表示该参数代表了一个将要使用的值,不可改变。例如:数组类模板,可以有一个数组长度的模板非类型参数nSize四、类模板数组类模板举例templatetypenameT,intnSizeclassarray{Tvector[nSize];intsize;public:array():size(nSize){}//或者,array(){size=i;}intfind(constT&);//在数组中找给定元素T......};模板参数名表模板参数表四、类模板类体外定义的成员函数是函数模板template模板参数表返回类型类名模板参数名表::成员函数名(形参表){……;//成员函数体}templatetypenameT,intnSizeintarrayT,nSize::find(constT&t){……//成员函数体}四、类模板如何使用类模板:实例化instantiation由类模板的定义生成类的过程其格式为:类名类模板实在参数表可以通过typedef定义实例化的类名,例如:typedefarrayint,20IntArray;//生成类IntArrayia;//创建对象也可以同时进行类与对象的实例化:arrayint,20ia;四、类模板举例:链表queue//template_queue.cppvoidmain(){//主函数Queueint*p_qi=newQueueint;for(intival=0;ival10;++ival){p_qi-add(ival);}interr_cnt=0;for(ival=0;ival10;++ival){intqval=p_qi-remove();if(ival!=qval)err_cnt++;}if(!err_cnt){coutqueueexecutedokendl;}elsecoutqueueerrors:err_cntendl;}//myqueue.htemplatetypenameTypeclassQueueItem;//前向声明templatetypenameTypeclassQueue{//类模板定义public:Queue():front(0),back(0){}~Queue();Typeremove();//弹出队首元素voidadd(constType&);//加入一个元素boolis_empty()const{//测试队列是否空returnfront==0;}private:QueueItemType*front;//不能省略TypeQueueItemType*back;};//myqueue.htemplatetypenameTypeclassQueueItem{public:QueueItem(constType&t):item(t){next=0;};private:Typeitem;QueueItem*next;friendclassQueueType;//友元类};//myqueue.htemplatetypenameTypeQueueType::~Queue(){while(!is_empty()){remove();}}//Queue析构函数templateclassTypevoidQueueType::add(constType&val){QueueItemType*pt=newQueueItemType(val);if(is_empty())front=back=pt;else{back-next=pt;back=pt;}}//add成员函数templateclassTypeTypeQueueType::remove(){if(is_empty()){cerrremove()onemptyqueue\n;exit(-1);}QueueItemType*pt=front;front=front-next;Typeretval=pt-item;deletept;returnretval;}四、类模板举例:basic_stringbasic_string:STL的基本串类模板//通常实例化为char字符串类typedefbasic_stringcharstring;//也支持宽字节字符串类typedefbasic_stringwchar_twstring;字符是编程中极易出错的地方string的含义比较混乱:char*、constchar*、string类的对象四、类模板举例:basic_stringC-string:char*、constchar*STL-string:string/wstring类的对象举例:实现单词逆序输出pots&pans,Isawareedstop&snap,Iwasadeervoidmain(){conststringdelims(\t,.;);stringline;while(getline(cin,line)){//对于成功读取的每一行string::size_typebegIdx,endIdx;//搜索第一个单词的开头begIdx=line.find_first_not_of(delims);while(begIdx!=string::npos){//如果找到单词开头endIdx=line.find_first_of(delims,begIdx);//搜索词尾if(endIdx==string::npos){endIdx=line.length();}//单词结尾就是行尾//逆序输出单词for(inti=endIdx-1;i=(int)begIdx;--i)coutline[i];cout'';//搜索下一个单词的开头begIdx=line.find_first_not_of(delims,endIdx);}coutendl;}}四、类模板总结类模板的声明和定义模板成员函数类模板的实例化产生类定义对象关注:类模板的使用