高效C++ --模板与泛型编程

在C++中模板体现的是编译期多态,virtual体现的是执行期多态。

关于typename的双重含义:

在声明template參数时,不论使用keywordclass或typename,意义全然同样。

可是C++并不总是把class和typename视为等价。

有时候必须使用typename。

Template内出血的名称假设依于某个template參数,称之为从属名称。假设从属名称在class内呈嵌套状,我们称她为嵌套从属名称。

总而言之,在一个模板中使用了还有一个模板内的參数类型,就须要使用typename表明所使用的这个变量是属于一个模板中的类型。

不论什么时候当你想要在template中值涉一个嵌套从属类型名称,就必须在紧邻他的前一个位置放上keywordtypename

使用typename表示嵌套从属类型名称。但不得在base class list(基类列)或member initialization list(成员初值列)内以它作为baseclass修饰符。

在使用new申请内存时,假设内存空间不足。可能会有异常发生,可是能够从外界设置异常发生时调用的函数。set_new_handler

区分接口继承和实现继承:

函数接口继承和函数实现继承。这两种继承的差异,非常像函数声明与函数定义之间的差异。

有时候希望derived classes仅仅继承成员函数的接口(也就是声明);有时候你又会希望derived classes同一时候继承函数的接口与实现。但又希望可以override他们所继承的实现;又有时候你希望derived classes同一时候继承函数的接口和实现。而且不同意override不论什么东西。

事实上上面的三种情况分别相应三种情况,各自是纯虚函数,虚函数,和基类的函数

声明一个pure virtual函数的目的是为了让derived classes仅仅继承函数接口。

声明简朴的impure virtual函数的目的。是让derived classses继承该函数的接口和缺省实现。

声明non-virtual函数的目的是为了令derived classes继承函数的接口及一份强制性实现。

模板特化的方法。对于模板的特化就像是又定义了一个模板,只是这个模板的參数是已经规定好的,所以的template里面就不须要定义typename。相当于模板的重载,仅仅只是这个模板的參数是已经规定好了的。

Effective C++中提到过。使用const enum inline取代#define,这里的意思是前面能够替代后面。由于对于#define来说。将来替换的始终是文本。假设有错或者使用#define不是非常恰当,可能在编译的时候不会出错可是在执行过程会出错。假设是使用前者来搞定这些,他们假设有错,在编译的时候是能够发现的。

眼下全部编译器对于virtual function 的实现方法都是使用各个class专属的virtual table。大小固定,而且在程序运行前就构造好了。

C++在布局以及存取时间上基本的额外负担是由virtual引起的。

Virtual function机制:用以支持一个有效率的“运行期绑定”

Virtual base class用以实现“多次出如今继承体系的base class 有一个单一而被共享的实体”

这两种机制分别相应子类中的vptr vbtr子类中有两个指针。分别运行他们

另一些多重继承下的额外负担,发生在“一个derived class和其第二或后继之base class的转换”之间。

Effective C++--经验条款的更多相关文章

  1. 《More Effective C++》 条款5 谨慎定义类型转换函数

    ---恢复内容开始--- C++编译器能够在两种数据类型之间进行隐式转换(implicit conversions),它继承了C语言的转换方法,例如允许把char隐式转换为int和从short隐式转换 ...

  2. 《MORE EFFECTIVE C++》条款20 条款21

    条款20 协助编译器实现返回值优化 当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数, ...

  3. 《Effective C++》条款26 防卫潜伏的ambiguity模棱两可的状态

    每个人都有思想.有些人相信自由经济学,有些人相信来生.有些人甚至相信COBOL是一种真正的程序设计语言.C++也有一种思想:它认为潜在的二义性不是一种错误.ambiguity 这是潜在二义性的一个例子 ...

  4. 《Effective C++》条款14 总是让base class拥有virtual destructor

    有时,一个类想跟踪它有多少个对象存在.一个简单的方法是创建一个静态类成员来统计对象的个数.这个成员被初始化为0,在构造函数里加1,析构函数里减1.(条款m26里说明了如何把这种方法封装起来以便很容易地 ...

  5. Effective C++:条款37:绝不又一次定义继承而来的缺省參数值

    因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...

  6. Effective C++:条款28:避免返回 handles 指向对象内部成员

    (一) 有时候为了让一个对象尽量小,能够把数据放在另外一个辅助的struct中,然后再让一个类去指向它.看以下的代码: class Point { public: Point(int x, int y ...

  7. Effective C++:条款25:考虑写出一个不抛异常的swap函数

    (一) 缺省情况下swap动作可由标准程序库提供的swap算法完毕: namespace std { template<typename T> void swap(T& a, T& ...

  8. Effective C++:条款14:在中小企业资源管理copying表现

    (一) 在一项条款说法auto_ptr和tr1::share_ptr适合heap-based资源.然而,并非所有的资源都heap-based的.换句话说不tr1::shared_ptr 和 auto_ ...

  9. More Effective C++ 35 条款

    一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...

随机推荐

  1. 汕头市队赛SRM15

    T1——czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老 ...

  2. Android控件点击事件

    1. 介绍 本文介绍了Android控件的点击事件 Android控件点击(onClick)事件可以用如下三种方式来实现 2. 实现onClick方法 在layout的xml中指定onClick方法, ...

  3. sklearn的常用函数以及参数

    sklearn可实现的函数或者功能可分为如下几个方面 1.分类算法2.回归算法3.聚类算法4.降维算法5.模型优化6.文本预处理 其中分类算法和回归算法又叫监督学习,聚类算法和降维算法又叫非监督学习 ...

  4. 委托delegate与Dictionary实现action选择器

    大家一定都有这种情况,1.前台页面信息是通过Ajax请求的方法加载的;2.或者是通过请求本页面加载的;3.请求的页面不仅仅是一个Http请求在 这咱情况下我们一般会加一个action的参数,用于区别是 ...

  5. Servlet 2.4 规范之第七篇:过滤器

    过滤器是一套java组件,用于在请求—>资源—>应答的这一过程中即时转换处理负载和头信息. 本章讲述了Servlet 2.4 API中一些类和方法,这些类和方法提供了一套轻量级框架用于过滤 ...

  6. Centos7下zabbix部署(五)定义报警媒介-微信

    1.注册微信 注册过程参考地址:https://www.cnblogs.com/hanyifeng/p/5368102.html 主要需要以下一些信息 CorpID :     wwxxxxxxxxx ...

  7. (1)请求web

    用来测试api的例子 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  8. (28)C#委托,匿名函数,lambda表达式,事件

    一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...

  9. 路由器漏洞利用工具RouterSploit

     路由器漏洞利用工具RouterSploit 网络中存在大量的嵌入式设备,如路由器.智能摄像头.这类设备安全防护程度较低.由于这些设备更新不方便,一旦发现漏洞,往往不能及时修复.所以,在网络渗透测试中 ...

  10. Linux基本命令参数

    简单复习一下基本命令的参数 1.mkdir 两个参数: -p 递归创建该目录 mkdir -p /user/hadoop/test/raid -m 指定权限   mkdir -m 777 /raid ...