码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++--经验条款

时间:2014-12-15 23:42:19      阅读:405      评论:0      收藏:0      [点我收藏+]

标签:c++

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

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

关于typename的双重含义:

在声明template参数时,不论使用关键字class或typename,意义完全相同。

但是C++并不总是把class和typename视为邓建。有时候必须使用typename。

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

总而言之,在一个模板中使用了另一个模板内的参数类型,就需要使用typename表明所使用的这个变量是属于一个模板中的类型。任何时候当你想要在template中值涉一个嵌套从属类型名称,就必须在紧邻他的前一个位置放上关键字typename

使用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++--经验条款

标签:c++

原文地址:http://blog.csdn.net/yusiguyuan/article/details/41950323

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!