C中级培训教材.docx

上传人:太** 文档编号:69698314 上传时间:2023-01-07 格式:DOCX 页数:41 大小:294.08KB
返回 下载 相关 举报
C中级培训教材.docx_第1页
第1页 / 共41页
C中级培训教材.docx_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《C中级培训教材.docx》由会员分享,可在线阅读,更多相关《C中级培训教材.docx(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C+中级培训教材说明:一、为便于储存与管理,各类培训教材均使用合订本。二、教材结构:各类培训教材由教材封面、前言、课程目录、单门课程教材与封底五部分构成。三、教材封面:1、封面颜色:教材封面为彩色,工作基本常识教材为深蓝色,技术基础知识教材 为草绿色,管理基础知识教材为浅蓝色,营销基础知识教材为墨绿色。2、教材名称:使用“工作基本常识”“技术基础知识”“管理基础知识” “营销 基础知识”,字体为隶书,黑体,60号。3、其他标识:员工培训中心编辑使用宋体、黑体、三号,位于教材名称下面;华 为技术有限公司使用宋体、黑体、小二,位于底端;华为标识位于华为技术有限公 司与员工培训中心编辑之间;右上角为

2、保密标识,楷体,黑体,四号。四、教材封底:教材封底包含教材名称、华为技术有限公司员工培训中心与时间、版本号,位于页 面的右下角。五、前言:教材前言为各类培训的目的、课程门类、特点、要紧内容的简介。六、课程目录:为各门课程排列顺序的目录,统一编排页码,便于学员查找。七、单门课程教材:各单门课程教材由课程封面、章节目录、章节内容、学习要求、思考题、参考资料 与有关网站构成。1、课程封面:课程封面为彩色,课程名称之隶书、60号、黑体、黑色,左上角为课程编码。2、章节目录:为宋体、小四、黑色3、章节内容:int CMyStringHandle:Length()return m_pThis-Length

3、();int CMyStringHandle:Index(const char *psz)return m_pThis-Index(psz);这是所有客户程序员都能看到的。这行class CMyString;是一个没有完全指定的类型说明或者类声明(一个类的定义包含类的主体)。它告诉编 译器,Cheshire是一个结构的名字,但没有提供有关该结构的任何东西。这对产生一 个指向结构的指针来说已经足够了。但我们在提供一个结构的主体部分之前不能创建一 个对象。在这种技术里,包含具体实现的结构主体被隐藏在实现文件中。在设计模式中,这就叫做Handle-Body模式,Handle-Body只含有一个实体指

4、针, 服务的数据成员永远被封闭在服务系统中。Handle-Body模式如下:classHandlem_pThis/xclass图1 Handle-Body模式(句柄类做为接口)Handle-Body的布局结构永远不可能随着实现类数据成员的加入或者者删除或者者修改 而导致Hand 1 e-Body的修改,即Hand 1 e-Body协议不依靠于C+实现类的任何细节。这就有效的对用户的编译器隐藏了这些斜街,用户在使用对这项技术时候,Handle-Body接 成了它唯一的入口。然而Handle-Body模式也有自己的弱点:1、接口类务必把每一个方法调用显示的传递给实现类,这在一个只有一个构造 与一个

5、析构的类来说显然不构成负担,但是假如一个庞大的类库,它有上百 上千个方法时候,光是编写这些方法传递就有可能非常冗长,这也增加了出 错的可能性。2、关于关注于性能的应用每一个方法都得有两层的函数调用,嵌套的开销也不 理想3、由于句柄的存在依然存在编译连接器兼容性问题。接口与实现分离的Handle-Body。抽象接口使用了 “接口与实现的分离”技术的Handle-Body解决了编译器/链接器的大部 分问题,而C+面向对象编程中的抽象接口同样是运用了 “接口与实现分离”的思想, 而使用抽象接口关于解决这类问题是一个极其完美的解决方案。1、抽象接口的语言描述:class IMyString(virtu

6、al int Length() const = 0; /这表示是一个纯虚函数,具有纯虚函数的 接口virtual int Index(const char *psz) const = 0;;2、抽象接口的内存结构:3、 抽象接口的实现代码:接口:class IMyString(virtual int Length() const = 0; /这表示是一个纯虚函数,具有纯虚/函数的接口virtual int Index(const char *psz) const = 0;);实现:class CMyString: public IMyString(private:const int m_cch

7、;char *m_psz;public:CMyString(const char *psz);virtual -CMyStringO;int Length() const;int Index(const char *psz) const;从上面使用抽象接口的实例来看,抽象接口解决了Handle-Body所遗留下来的全 部缺陷。抽象接口的一个典型应用:抽象工厂(AbstractFactroy)OwteScfoOSarO CafeButtonO CrwKtMonuOPMFsctoryModfFactoryreiumreturn new PMrotum new MotCreateSerollBarO

8、 Croate8uflon() CreateMeruiQreturn new PMMenu JCgteScBifiarO A OoeleGuttonO CreateMenuQMacFoctoryCreoteScroflBarO CrMaduttonO CreaieMonuQreturnreturn nvw MacMemi j图3抽象工厂模式1.2 多继承与菱形缺陷、this跳转等多重继承是C+语言独有的继承方式,其它几乎所有语言都秉承了单一继承的思 想。这是由于多重继承致命的缺陷导致的:1.2.1 菱形缺陷当继承基类时,在派生类中就获得了基类所有的数据成员副本。假如类B从A1与A2两个类多重继

9、承而来,这样B类就包含Al、A2类的数据成员副本。考虑假如Al、A2都从某基类派生,该基类称之Base,现在继承关系如下:Base图4菱形继承关系我们C+语言来描述这种继承关系:class Base ;class Al :public Base ;class A2 :public Base ;class B :public Al,public A2 ;那么Al、A2都具有Base的副本。这样B就包含了Base的两个副本,副本发生了重 叠,不但增加了存储空间,同时也引入了二义性。这就是菱形缺陷,菱形缺陷时 间是两个缺陷:1、子对象重叠2、向上映射的二义性。菱形缺陷的其中一种解决办法将在C+世界里

10、最广泛的使用虚拟继承解决菱形缺陷的应用便是标准C+的输入/输出 iostream;图5标准C+的输入/输出1.2.2 多重接口与方法名冲突问题(Siamese twins)对继承而来的虚函数改写很容易,但是假如是在改写一个“在两个基类都有相同 原型”的虚函数情况就不那么容易了。提出问题:假设汽车最大速度的接口为ICar,潜艇最大速度的接口为IBoat,有一个两栖类 的交通工具它能够奔跑在马路上,也能够航行在大海中,那么它就同时拥有ICar、IBoat 两种交通工具的最大速度特性,我们定义它的接口为ICarBoat;class ICar(virtual int GetMaxSpeed ()二0;

11、;class IBoat(virtual int GetMaxSpeed ()二0;;我们先对ICarBoat的接口做一个尝试:class CCarBoat(virtual int GetMaxSpeed (); 既完成ICar的GetMaxSpeed ()接口 方法又完成IBoat的接口方法?显然不能够); 解决问题:显然上面这个尝试根本就无法成功,只用一个实现方法,怎么能够求出这个 ICarBoat交通工具奔跑在马路上的最高时速,同时也能够求出航行在大海上的最大航行 速度呢。上面这一问题矛盾就在一一个方法,却需要两个答案。看来ICarBoat要返回两个 答案就务必有两个方法了,我们假设一个

12、方法是求在陆地上奔跑的速度,名称之 GetCarMaxSpeed ();另一个方法是求在大海上航行的最大速度,名称之 GetBoatMaxSpeed ();那这两个方法又怎么与GetMaxSpeed ()接口方法联系起来呢;幸运的是,我们找到熟悉决办法,而且解决办法有很多种,下面介绍一下继承法。 class IXCar :public IC ar(virtual int GetMaxSpeed ()(GetCarMaxSpeed();)virtual int GetCarMaxSpeed () = 0;;class IXBoat:public IBoat(virtual int GetMaxS

13、peed ()(GetBoatMaxSpeed();virtual int GetBoatMaxSpeed () =0;;classCCarBoat: public IXCar , public IXBoatvirtual int GetCarMaxSpeed ()virtual int GetBoatMaxSpeed ());图6多重接口与方法名冲突问题1.2.3 this 跳转this跳转是指的“对象同一,性”问题。在单一继承的世界内,不管继承关系怎么复杂,针关于同_对象,不管它的子类 或者者父类的this指针永远相等。即假如有下面的模型:A图7 B从A继承的关系图那么 关于一个已经实例化

14、B类的对象bObject,永远有(B*) &bObject =(A*)&bObject 成立。但是在多继承的世界内,上面的等式就不能恒成立,对象的同一性受到了挑战。特别的是,在多继承世界内假如图四的菱形关系存在情况下,假如关于已经实例 化B类的对象bObject; (Base*) (Al*) &bObject != (Base*) (A2*) &bObject 成 立,当这种情况发生的时候我们就只能特殊处理了。这种情况在COM应用中处处都会发 生。1.3 C+多态的两种多态形式与区别C+有两种多态多态形式:1、编译时刻多态,编译时刻多态依靠函数重载或者者模板实现2、运行时刻多态。运行时刻多态依

15、靠需函数虚接口实现第二章重载学习要求:1、熟悉什么是函数重载,什么是运算符重载2、学会运用智能指针,仿函数在C+的世界里,有两种重载:函数重载与运算符重载,函数重载就使用使用参数匹配 的原则,进行重载的,它是一种编译时刻的多态。而运算符重载,使使用改写或者者说 重新定义C+的内嵌运算符的方法。有关重载的基本概念:Overloaded FunctionsOverloaded Operators Declaration MatchingArgument MatchingArgument Types MatchingArgument Counts Matching C+ Unary Operator

16、sBinary OperatorsSmart PointerFunction objects1.1函数重载函数重载方法是在当前范围内选择一个最佳匹配的函数声明供调用该方法者使用。假如一个适合的函数被找到后,这个函数将会被调用,在这里“适合的”是指按下 列顺序匹配的符合下面条件的:1、一个精确匹配的函数被找到2、一个参数只有细微的差别,几乎能够忽略不计的。3、象类似通过子类向父类转化达到参数匹配的4、通过正常转化函数进行类型转换,能够达到参数匹配到的。5、通过用户自定义的转化函数(如转化运算符或者者构造函数)达到参数匹配 的6、参数是使用省略符号函数重载的方法基本上有:1、根据函数参数数据类型的

17、不一致进行的重载;2、根据参数个数的不一致进行的重载;3、缺省参数上的重载(1)标题:章节目分别以“第一章、第二章、第三章” “1.1、1.2、1.3”与“(1)(2) (3) ”来表示。章为宋体、小二、黑体,节为宋体、四号、黑体,目为宋体、 小四、黑体。(2)文字:每四个小时的培训课程,字数操纵在1000020000字之间。教材文 字通常为宋体、小四、黑色,行间距为一行半。(3)内容:章节内容要有完整的理论体系,不能成为授课胶片的翻版。4、学习要求:每章标题下面为本章的学习要求,以明确本章要掌握的要点。文字为楷体、小四。5、思考题:每章最后要有思考题,以便帮助学员复习、思考。6、参考资料与有

18、关网站:有参考资料与有关网站的要附在课程后面,以便帮助学员查阅。我们在这里把缺省参数也称之一种函数重载,实际上它并不是严格意义上的重 载。在使用缺省参数时务必记住两条规则。第一,只有参数列表的后部参数才但是缺省 的,也就是说,我们不能够在一个缺省参数后面又跟一个非缺省的参数。第二,一旦我 们开始使用缺省参数,那么这个参数后面的所有参数都务必是缺省的。第三,缺省参数 只能放在函数声明中。第四,缺省参数能够让声明的参数没有标识符。4、返回值重载特别注意,在C+中并没有根据返回返回值的不一致进行重载的,即我们 不能定义这样的函数:void f ();int f ();在C+中这样的函数声明方法是被禁

19、止的,但是我们有的时候间可能又需要这样 的重载方法,我们又怎么实现呢,事实上很简单,jiang函数的参数进行扩展,将这个 函数返回值的数据类型,做为扩展参数的数据类型来。如下:void f (void);void f (int);如今这个例子中的参数列表的数据,只在编译时刻起到分练函数的作用,在运行 时刻并不起到传值作用,模板中经常都应用到了这种方法。1. 2运算符重载你能够重新定义C+绝大多数内嵌运算符的实现方法与功能,这些重定义的或者 者说重载的运算符,有可能全局作用的,也有可能作用在类基础之上的,运算符重载的 实现可能以类的成员函数的形式出现,也有可能以全局性的函数的身份出现。在C+中重

20、载运算符的名字为operators,在这里x是一个可重载的运算符,如: 重载加法运算符,你需要定义一个名为operator+的函数,然后实现他,其它的类似 定义就能够了,比如:Class complex /very simplified complexdoublere, im;public:complex(doubler, doublei):re(r), im(i);complex operator+(complex);complex operator(complex);):定义了 complex这个复数的一个简单的实现概念模型。一个复数是由一对double 类型的数据构成,并定义了这个复数的

21、两个方法,加法运算complex: :operartor+ () 与乘法运算complex: :operator* ().现在我们就能够实现下面的复数表达式了:void f ()complex a = complex(1 , 3. 1);complex b = complex(1. 2 , 2);complex c 二 b;a = b + c;b = b + c * a;c= a * b + complex(1 , 2);)1.3.1 C+可重载的与C+不可重载的运算符可重载运算符表:OperatorNameTypeOperatorNameTypeCommaBinary-*Pointer-to

22、-member selectionBinary1 Logical NOTUnary/DivisionBinary1 =InequalityBinary/=Division/assignmentBinary%ModulusBinaryLess thanBinary%二Modulus/assignmentBinaryLeft shiftBinary&Bitwise ANDBinary=LeftBinaryshift/assignment&Address-ofUnaryGreater thanBinary*MultiplicationBinary=Greater than orBinaryequal

23、 to*Pointer dereferenceUnaryRight shiftBinary*=Multiplication/assignBinary=RightBinaryshift/assignment+AdditionBinaryArray subscript+Unary PlusUnaryExclusive ORBinary+Increment1UnaryExclusiveBinaryOR/assignment+=Addition/assignmentBinaryBitwise inclusive ORBinarySubtractionBinaryBitwise inclusiveBin

24、aryOR/assignmentUnary negationUnaryLogical ORBinary Decrement1UnaryOne s complementUnary -Subtraction/assignBinarydeletedelete-Member selectionBinarynew不可重载运算符表:OperatorNameMember selection*Pointer-to-member selection Scope resolution9 Conditional#Preprocessor symbol#Preprocessor symbol在上面可重载的运算符能够看

25、出运算符重载共分为两类:一元运算符重载与二元运算 符重载一元运算符重载:在声明一个类的非静态的一元运算符重载函数时,你务必声明的形式如 下:ret-type operator。/?。(1)在这里ret-type是指返回数据类型op是指一元运算符在声明一个全局的一元运算符重载函数时,你务必声明的形式日下:ret-type operator。夕(arg )(2)在这里ret-type与op与上面的意思一样,arg是指这个运算符所作用 的数据类型二元运算符重载:在声明一个类的非静态的二元运算符重载函数时,你务必声明的形式如 下:ret-type operatorop(arg).(3)(3)式与二式基

26、本相同arg能够是任何一个在声明一个全局的二元运算符重载函数时,你务必声明的形式日下:ret-type operatorop(argJ9 arg2).(4)在这里ret-type与op与上面的意思一样,argl, arg2,是指这个运算 符所作用两个数据类型1.3.2 几类特殊的运算符重载1、类型转换运算符所有的数据类型均能够定义构造函数,包含系统定义的数据类型与用户自定义的数据类型,如: class CString operator LPCSTR() const;应用:CString str = 12345”;LPCSTR Ipsz = str; 此处会进行LPCSTR运算这只是一个简单的应

27、用的示例,事实上有的时候间类型转换具有无比强大的功 能。我曾经就是用类型装换运算符重载解决一个跨平台通信的问题。2、bool运算符重载int、float、bool等运算符也是能够重载的,比如重载bool运算符,但是 重载运算符bool时候,需要注意有很多烦恼与臆想不到的东西 template class testbool( operator bool() const throw()(return m_ pT != 0;)private:T *m_pT;下面结果均通过编译testbool spl;testbooKstd: :string sp2;if (spl = sp2)if (spl !=

28、sp2)bool b = splint I = spl * 10;从上面能够看得出bool的表现已经远远超过bool本身了,因此建议大家不 要轻易对bool进行重载操作。3、地址运算符重载在DCOM应用中,我们有一个重载运算符的例子:STDAPI CoCreatelnstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFI ID riid,LPVOID *ppv);我们看最后一个参数LPVOID指针的指针,这里是一个输出参数,返回 一个接口的指针。通常情况下我们应用如下IUnknown *pUn;CoCreat

29、eInstance(,(void *)& pUn); (5)然而我们也能够这样写:IUnknown *pUn;CComPtr comPtr(pUn);CoCreatelnstance(,(void *)& comPtr); (6)之因此能够这么写这是由于CComPtr重载了运算符,如下:template class CComPtr (public: CComPtr(T* Ip) (if(p = lp) !=NULL) p-AddRef();T* operator&()ATLASSERT(p二二NULL);return &p;)private:T* p;);&comPtr实际上是得到了通常的情况

30、下,我们并不能对pUn的地址,因此(5)式与(6)式事实上传 入的参数是一样当都是传入了 pUn的地址。尽管我们能够对运算符进行重载,但通常情况下我们并不是很提倡这种操 作,这是由于:A、暴露了封装对象的地址,如上面CComPtr对pUn的封装事实上不起任 何作用,任何时候我都能够直接访问与修改pUn指针,这就意味着所有 权的完全丧失,封装不起任何意义B、关于unary operator&的重载使得重载对方永远无法与STL容器进行任 何融合,甚至无法参与任何泛型编程。一个对象的地址是一个对象最基本的概念,在通常情况下,我们并不提倡, 也请大家慎用地址运算符的重载。4、指针运算符重载指针运算符,

31、有一个及其特殊且及其重要的机制:当你对某个型别实施。perator-而这个型别并非原生指针时候: 编译器会从这个型别中找出用户自定义的operator-),并实施后,编译器将继 续对这个operator-返回的结果实施operator-)直到找到一个原生指针。这种机制导致了一个特有的技术:(pre and post function calls ), “前调用”及后调用技术。应用如下:class CallDoSomething(public:void DoCall()(TRACE(DoCalln););templateclass CalllnMutiThreadclass LockProxy

32、( public:LockProxy(T*pT) :m_pT(pT) (TRACE(HLock nn);)LockProxy。 (TRACE(HUnLock nH);) T *operator-。 (return m_pT;) private:T *m_pT;);public:CallInMutiThread(T* pT) :m_pT(pT)( ) LockProxy operator-()( return LockProxy(m_pT );) private:T *m_pT; ;上面CallDoSomething是函数调用,假设这个类原先是在单线程中运行的,但是现在已经移植到了多环境中,因此

33、我们就增加了 CalllnMutiThread对 原始类 进行配接使之习惯与多线程环境,调用过程如下:CallDoSomething DoSomthing;CallInMutiThread MutiThread(&DoSomthing);MutiThread-DoCall();调用结果如下:LockDoCallUnLock从上面能够看出在调用CallDoSomething的成员函数DoCall之前调用 了 Lock方法,在调用结束后有调用了UnLock。这就是所谓的“前调用”与“后 调用”,事实上并不仅仅是多线程问题能够使用此办法,所有的“前调用”与“后 调用”模式均可由此解。重载“-”运算符

34、,同时引出了智能指针的概念,参见下页。5、括号运算符重载语法特征:primary-expression (expression-list)括号运算符是一个同”运算符一样也是一个及其重要的运算符 在MSDN上说括号运算符是一个二元运算符,我觉得这个说法是完全错误的,在 所有C+运算符重载中,括号运算符,应该是唯一没有规定参数元的个数的。它 的参数能够从0个到N个。示例:class Point(public:Point() _x = _y =。; Point &operator()( int dx, int dy ) _x += dx; _y += dy; return *this; privat

35、e:int _x, _y;);调用如下:Point pt;pt( 3, 2);从上面能够看出,括号运算符,调用形式如下:objectparameter list);看起来与函数的形式是完全一样的:function parameter list);因此根据这一特点我们称之为仿函数。第三章 模板学习要求:1、熟悉什么是模板2、学会运用模板函数,模版类与STL模板(templates),与以模版为基础的泛型编程与泛型模式,是当今C+中最活 跃的一项编程技术,模版的第一个革命性的应用就是Standard Template Library (简 称STL)。STL将templates技术广泛应用于STL

36、容器与STL算法上,在这一领域template 技术发挥到了极致。本章介绍C+ templates的基本概念与语言特性1.1 认识模板1、模板的基本语法是:template declaration这个template描述了一个参数化的类(模板类)或者者是一个参数化的函数(模 板函数),这个模板参数列表是用逗号分隔的类型列表(在这个表单忠使用class或者 者是typename来标识这个数据类型)。在某些情况下这个模板体内可能不存在任何 的数据类型。declaration域务必是一个函数或者者类的声明。1.4 模板函数语法定义:template function-name(parameter l

37、ist) ()比如:template inline T const& max (T const& a, T const& b)/ if a b then use b else use a return ab?b:a;内部资料,注意保密C+中破培训散程员工培训中心 编辑2005年6月 VI. 0华为技术华为技术有限公司1 :通过调用的参数来识别模板的各参数类型MAX (4,4.2); / OK, but type of first argument defines return type 2:明确指定参数的类型:MAX(4,4 2); /OK在我们的例子中这个参数列表是typename T,事实

38、上在这里typename是能够 用class替换的,typename是在C+演化过程中逐步形成的,而class是一个历史性 的概念,typename表达了一个比class更抽象意义上的概念。有如下定义如:class typenamedef(typedef int INT_TYPE;);假如这样表达是正确的:templateclass testtypename:public typenamedef(public:typename T:1NT_TYPE;INT_TYPE mjnt;);但是假如把此处的typename换成class就会报错1.4.1 重载模板函数(Overloading Funct

39、ion Templates)与普通的函数一样,模板函数也能够被重载,也就是说对象同的函数名,你能够 具有不一致的函数定义,在调用的时候再由C+编译器决定,那一个候选函数更有资格 被匹配调用。下面这个简单的例子说明了重载模板函数的方法与过程:/ maximum of two int valuesinline int const& max (int const& a, int const& b)(return ab?b:a;)/ maximum of two values of any typetemplate inline T const& max (T const& a, T const& b

40、)return ab?b:a;/ maximum of three values of any typetemplate inline T const& max (T const& a, T const& b, T const& c) (return max (max(a,b), c);)int main()(:max(7, 42, 68);/ calls the template for three arguments:max(7.0, 42.0);/ calls max (by argument deduction):max(a, b);/ calls max (by argument d

41、eduction):max(7, 42);/ calls the nontemplate for two ints:max(7, 42);/ calls max (by argument deduction):max(7, 42); / calls max (no argument deduction) 上面这个例子也说明了普通的函数与模板函数能够拥有同一个名字,而且能够被 初始化为同一类型,如:max(7, 42)调用匹配非模板函数也匹配模板函数。1.5 模板类基本的语法定义:template class class-name( ;具有缺省参数的模板定义形式template class cl

42、ass-name );在模板中用到了大量非习惯性思维方法,大家在学习模板之前需要熟悉这些模板 设计的思维方法:申明并不一定需要定义:1、申明一个函数,并不实现在C+中我们可能由于禁止某个缺省函数的调用操作而申明该缺省函数,但 不定以它,比如:class testDeclarepublic:testDeclare(););我们对上面的testDeclare的缺省构造函数进行了声明,但是我们并没有 构造函数的的定义,当我们执行testDeclare declare;上面这个申请创建一个对象的操作会被编译系统所禁止 当然,我们也能够对缺省的重载运算符实施同样的手段 2、申明一个函数而不实现可能是为了

43、模板函数的泛化泛化:templateT testFun();特化:tempi ateint testFun() ( return 10; )3、申明一个函数可能仅仅为了获得特殊某一项功能比如:T MarkT();char Test(T);int Test(.);sizeof(MarkT();上面的例子事实上就是求T类的的字节数,事实上在通常情况下,我们直 接写sizeof(T)就能够了,然而有的时候系统并不同意我们这样做,因此我 们就能够通过上面的例子MarkT()函数,事实上上面的MarkT(),char Test(T) 函数int Test(.)都是没有定义的,但是由于sizeof是编译时刻的运算, 因此它并不需要关心 这些函数是否实现。申明一个类而不实现比如我们在禁止模板类的泛化过程中就能够实现templateclass

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁