C++Overview潘爱民panaimin@icst.pku.edu.cn内容简介C++语言基础Object-BasedProgrammingObject-OrientedProgrammingSTLC++之我见C++语言在变化,我们的概念也要调整变化最能反映OO思想的语言,掌握C++有助于理解OO区分C和C++,C++不是C语言,不要用看待C语言的方式来看待C++掌握C++语言的基础知识操作系统的基础知识–文件API、内存管理…infrastructures计算机原理–汇编语言–C/C++是产生ASM代码的framework编译和执行过程–编译过程–执行过程许多概念–进程、heap、stack,...程序开发过程开发编辑编译出错?链接执行结果正确?结束源程序file.cpp目标程序file.obj库函数和其它OBJ可执行程序file.exeYesYesNoNoBuild过程:compiletimeCompile+link如何对待错误和警告–错误:一定要排除,从第一个错误找起–警告:或者排除,或者确实理解不会对程序造成危害学会设置compileoptions和linkoptions–IDE中如何设置?——一定要知道!–命令行如何设置?–程序代码中如何设置?执行过程:runtimeLoad、重定位、初始化、main如何调试–断点–assertion程序对环境的依赖性–系统环境–CRT–内存影像C++语言内容数据类型–内置(built-in)、标准库、自定义的表达式控制语句函数(模板)异常处理函数模板例子:templateclassTypeTypemin(Typea,Typeb){returnab?a:b;}min(10,20);min(10.0,20.0);模板实例化——由参数决定–隐式实例化–显式实例化–minint(10,20);函数模板(续)两种编译模式:–inclusion模式–separation模式(export关键字)模板特化重载函数模板异常处理(exceptionhandling)错误处理机制、错误代码隔离Throw(raise)anexception–Throwexpression–类似于return语句Try、catch语句(handler)–try{}–catch(type){}或catch(typeobj){}类似于函数调用–但是类型匹配发生在runtime异常处理(续)嵌套机制,如果最外层没有处理,则由terminate来处理Localobject正常析构rethrow–在catch子句中仍然可以throwCatchallhandler–catch(…)声明函数时指定函数可能的异常–intfunc(int)throw(string);–如果没有指定的异常发生,调用unexpected()Object-BasedProgrammingclass实现数据封装对象构造函数与析构函数访问控制、友元嵌套类类中成员初始化虚拟函数类中运算符重载类模板this指针在类的内部指向类自身的指针在每个成员函数中,this指针提供了使用上的方便this指针把类的多个实例对象区分开来模板函数模板即以数据类型为“参数”的函数例如:templateclassTSwap(T&a,T&b){Ttemp;temp=a;a=b;b=temp;}类模板(模板类或类生成器)即以数据类型为“参数”的类例如:templateclassTclassStack{private:Tpool[maxNum];intsp;public:Stack();voidPush(Tx);TPop();BOOLIsEmpty()const;BOOLIsFull()const;};使用:StackintintStack;StackfloatfloatStack;模板(续)定义模板实例化模板参数:类型参数、非类型参数两种编译模式:–inclusion模式–separation模式(export关键字)类模板特化(classtemplatespecializations)类模板部分特化(classtemplatepartialspecializations)从面向过程转换到面向对象面向过程以功能为组织单元在C语言中以函数作为功能单元;通过数据结构来描述具体的问题;数据在功能(函数)之间以参数的形式被传送。面向对象用类class封装数据以及与数据相关的操作;用类的继承性来实现类的重用性;多态性。Object-OrientedProgrammingCShapeCPointCLineCCircleCArcCTextCShapeCPointCLineCCircleCArcCText多态性和虚拟函数多态性是面向对象的一个支柱允许程序在实施对象的操作时,允许对象按不同的方式完成不同类型对象的操作;不同类型对象有自己实现操作的方法。虚拟函数虚拟函数实现了多态性。说明:在函数说明之前加上关键字virtual在基类的说明中,定义虚拟函数:virtualvoidDisplay();调用:CShape*pShape=GetCurrentShape();pShape-Display();对象的内存分布图Vptr指针和vtab表classA{private:intvalue;public:virtualvoidFunc1(void)virtualvoidFunc2(void)};变量偏移量vptr0value4A::Func1A::Func2vtab对象的内存分布图(续一)classB:pulicA{private:intvalue1;public:virtualvoidFunc1(void)virtualvoidFunc2(void)};变量偏移量vptr0value4value18B::Func1B::Func2vtab对象的内存分布图(续二)classB:pulicA{private:intvalue1;public:virtualvoidFunc1(void)};变量偏移量vptr0value4value18B::Func1A::Func2vtab继承关系Public继承–“is-a”关系private继承–“has-a”关系–可以用复合类或者嵌套类来表示protected继承–比private继承放宽限制virtual继承–单个共享实例–虚基类的构造由themostderivedclass完成类型转换Static_castDynamic_cast–向下转换voidDraw(CShape*shape){//shape-DrawRect()//shape-DrawCircle()if(dynamic_castCRect*(shape)){…}}RTTI:typeidStatic_cast类型转换classB{...};classD:publicB{...};voidf(B*pb,D*pd){D*pd2=static_castD*(pb);//notsafe,pbmay//pointtojustBB*pb2=static_castB*(pd);//safeconversion...}Static_cast类型转换(续)classB{...};classD:publicB{...};voidf(B*pb){D*pd1=dynamic_castD*(pb);D*pd2=static_castD*(pb);}C++标准库C标准库iostreamlibrary–cin、cout、cerr–ostream&operator(ostream&os,constMyClass)–istream&operator(istream&os,MyClass&)STL(StandardTemplateLibrary)GenericProgramming作者:AlexanderStepanov目标:高效、灵活地实现各种算法思想:对算法进行抽象,与数据表示分开以模板技术为基础–函数模板–类模板C++的发展使得这种思想得以实现STL基础Object-BasedProgramming–有关class的各种设计技术函数对象(functionobjects)–重载了函数调用操作符()的类模板–函数模板–类模板–模板特化STL思想数据类型算法容器STL实现Iterator对象容器(Container)算法(Algorithm)Iterator对象Iterator对象STL容器顺序容器(SequenceContainer)–vector–deque–list关联容器(AssociativeContainer)–set–multiset–map–multisetSTL迭代器迭代器(Iterator)是指针(pointer)的泛化任意访问双向迭代器向前迭代器输入迭代器输出迭代器STL算法改变顺序的操作–reverse、replace不改变顺序的操作–for_each、find排序及相关操作–sort、rotate常用的数字操作–count、sum_up使用STL#includefunctional#includelist#includeiostream#includealgorithmusingnamespacestd;templatetypenameTvoidprint_elements(Telem){coutelem;}void(*pfi)(int)=print_elements;voidmain(){intia[7]={0,1,2,3,4,5,6};listintilist(ia,ia+7);//以陣列做為list的初值for_each(ilist.begin(),ilist.end(),pfi);//0123456ilist.push_back(7);ilist.push_back(0);ilist.push_back(7);ilist.push_back(9);for_each(ilist.begin(),ilist.end(),pfi);//01234567079ilist.remove_if(bind2nd(modulusint(),2));//去除所有奇數for_each(ilist.begin(),ilist.end(),pfi);//02460}C++参考书“C++ProgrammingLanguage”“C++Primer”(3/e)“DesignandEvolutionofC++”“InsidetheC++ObjectModel”“EffectiveC++”(2/e)“MoreEffectiveC++”“ExceptionalC++”“C++StrategiesandTactics”“GenericProgrammingandtheSTL”……