二级考试C++基础(类型和值之间的映射).pdf

上传人:赵** 文档编号:22471906 上传时间:2022-06-24 格式:PDF 页数:7 大小:151.37KB
返回 下载 相关 举报
二级考试C++基础(类型和值之间的映射).pdf_第1页
第1页 / 共7页
二级考试C++基础(类型和值之间的映射).pdf_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《二级考试C++基础(类型和值之间的映射).pdf》由会员分享,可在线阅读,更多相关《二级考试C++基础(类型和值之间的映射).pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、二级考试二级考试 C+C+基础基础( (类型和值之间的映射类型和值之间的映射) )映射整数为类型一个对很多的generic programming编程风格特别有帮忙的暴简洁的模板:template 不同于 Int2Type 等其它的类型的。 此外, 产生类型的值被“存放”在枚举(enum)的成员值里面。不管在任何时候,只要你需要快速“类型化” (typify)一个整型常数时,你都可以使用 Int2Type。问题描述:当需要依据不同的值选择不同的行为时,一般的做法是利用if.else.或者 case 构造来实现分支选择。 在一个型别模板化的函数过程中, 则可能消失问题。看下面的第一局部:Part

2、 1如下的范型容器 NiftyContainer 的元素型别范型化为 T。在容器中需要实现元素的赋值行为。特别规的自定义类型,其复制行为是简单的。特殊是具有多态特性的类型和一般的类型,其复制过程不一样。例如,一般类型可以采纳逐位复制的简洁方式, 而具有多态特性 (例如含有指针成员)的类对象则不宜采纳 这种方式。此处假定一般类型的复制采纳拷贝构造函数方式而多态的类型则采纳一个特地的虚函数clone 来做拷贝。#includeusing namespace std;class Normal int _i;public:Normal() _i = 0; Normal(const Normal / o

3、ther members omitted;class Polym int *_pi;Polym(const Polym / forbids copy-constructorvoid setp(int* i) _pi = i; public:Polym() _pi = 0; Polym* clone();/ other members omitted;templateclass NiftyContainer/ other members omittedpublic:void DoSomething()T* pSomeObj =new T;if (isPolymorphic) / branch1T

4、* pNewObj = pSomeObj-clone(); / customized behavior forcopying/ some operations on polymorphic objectpNewObj = 0;else / branch2T* pNewObj = new T(*pSomeObj); / using copy-constructor/ some operations on non-polymorphic objectdelete pNewObj;delete pSomeObj;/ other members omitted;int main(int argc, c

5、har* argv)/ using the container with elements” type NormalNiftyContainer nc;nc.DoSomething(); / error: 类 Normal 没有成员函数 clone/ using the container with elements” type PolymNiftyContainer nc2; /error: 类 Polym 的 copy-constructorprivatenc2.DoSomething();system(“PAUSE“);return EXIT_SUCCESS;错误会析根据我们的预期, 假

6、如元素类型是多态的, 那么只执行 branch1 局部,否则只执行 branch2,由于两种类型的元素有不同的拷贝函数。但是编译器可不会理睬这些,一律的都要加以编译,因此出错了。对于模板来说,不同的参数意味着不同的类型。 此外,模板的编译有一个特性, 即没有用到的模板函数是不会参加到编译中的, 只进展语法正确性的分析。 函数可以依据参数进展重载。为了做到“依据常数的值(此处就是isPolymorphic)只编译其中某一个分支(例如 branch1) ,而不编译其它分支,从而保证最终的代码中只包含需要的代码” ,我们可以利用上述的模板编译特性和函数重载特性。templatestruct Int2

7、Type / 制造了这个模板是为了用不同的常数值产生不同的类型enum value=v;templateclass NiftyContainerprivate:void DoSomething(T* pObj, Int2Type) / function_pT* pNewObj = pObj-Clone();/ some operations on polymorphic objectpNewObj = 0;void DoSomething(T* pObj, Int2Type) / function_nT* pNewObj = new T(*pObj);/ some operations on

8、non-polymorphic objectpublic:void DoSomething(T* pObj)DoSomething(pObj, Int2Type();/ other members are omitted;int main(int argc, char* argv)/ using the container with elements” type NormalNiftyContainer nc;/ ok/ using the container with elements” type PolymNiftyContainer nc2; / oksystem(“PAUSE“);return EXIT_SUCCESS;在编译过程中, 依据传递的 isPolymorphic 模板参数值的不同, 编译器将选择实现哪个函数。 若为 true,则实现 function_p,而不会尝试去编译 function_n。 这样就胜利做到了编译期多态,而不是执行期多态。这个技术的关键点就在于 Int2Type 模板。

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

当前位置:首页 > 教育专区 > 高考资料

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

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