高效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. hibernate中Configuration类的作用

    问题:我们在获得一个SessionFactory对象的时候经常是写下面这行代码: SessionFactory sessionFactory = new Configuration().configu ...

  2. linux和shell关系

    坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/   索引: 什么是shell shell的分类 shell脚本的执行方式   ...

  3. JS省份联级下拉框

    <script type="text/javascript"> var china=new Object();china['北京市']=new Array('北京市区' ...

  4. HDU RPG的错排 【错排&&组合】

    RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. 【Tomcat】如何注册Tomcat到Window Service服务

    对于Web项目来说,经常用的服务器就是Tomcat.但是麻烦的事是,每次都得启动一下Tomcat服务.但是,如果把Tomcat的服务注册为Windows Service服务,就可以设置为开机自动启动, ...

  6. Centos 查看进程的几条命令

    1. ps -ef | grep java 表示查看所有进程里 CMD 是 java 的进程信息 2. ps -aux | grep java -aux 显示所有状态 3. kill -9 [PID] ...

  7. centos6.5 以 zero-dependency Erlang from RabbitMQ 搭建环境

    rabbitmq 官方安装文档可参考:http://www.rabbitmq.com/install-rpm.html  ,由于rabbitmq 使用Erlang 开发的,运行环境需要用到Erlang ...

  8. 为什么32位系统最大支持4G内存??我自己悟出来了 终于 。。。。。

    今天突然开窍了,想通了..... 以下是我的抽象想法: 32位系统 这个 多少位 指的是 硬件的 一次性发送过来的位数,一个字节 等于8位,内存的一个存储单元就是一个字节,即8位. 也可以这样来想这个 ...

  9. HDU5469 Antonidas(树分治&&哈希)

    给你一颗点上有字符的树,问一个给定的字符串是否是这棵树上的两点的路径. 树分治的思想就是每次找重心,重心下的子问题分解去做,然后就是合并了.合并的时候用一个总的set<pair<len,h ...

  10. ORA-01940: cannot drop a user that is currently connected

    https://www.cnblogs.com/lwlxqlccc/p/8694696.html