Effective C++--经验条款
高效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++--经验条款的更多相关文章
- 《More Effective C++》 条款5 谨慎定义类型转换函数
---恢复内容开始--- C++编译器能够在两种数据类型之间进行隐式转换(implicit conversions),它继承了C语言的转换方法,例如允许把char隐式转换为int和从short隐式转换 ...
- 《MORE EFFECTIVE C++》条款20 条款21
条款20 协助编译器实现返回值优化 当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数, ...
- 《Effective C++》条款26 防卫潜伏的ambiguity模棱两可的状态
每个人都有思想.有些人相信自由经济学,有些人相信来生.有些人甚至相信COBOL是一种真正的程序设计语言.C++也有一种思想:它认为潜在的二义性不是一种错误.ambiguity 这是潜在二义性的一个例子 ...
- 《Effective C++》条款14 总是让base class拥有virtual destructor
有时,一个类想跟踪它有多少个对象存在.一个简单的方法是创建一个静态类成员来统计对象的个数.这个成员被初始化为0,在构造函数里加1,析构函数里减1.(条款m26里说明了如何把这种方法封装起来以便很容易地 ...
- Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...
- Effective C++:条款28:避免返回 handles 指向对象内部成员
(一) 有时候为了让一个对象尽量小,能够把数据放在另外一个辅助的struct中,然后再让一个类去指向它.看以下的代码: class Point { public: Point(int x, int y ...
- Effective C++:条款25:考虑写出一个不抛异常的swap函数
(一) 缺省情况下swap动作可由标准程序库提供的swap算法完毕: namespace std { template<typename T> void swap(T& a, T& ...
- Effective C++:条款14:在中小企业资源管理copying表现
(一) 在一项条款说法auto_ptr和tr1::share_ptr适合heap-based资源.然而,并非所有的资源都heap-based的.换句话说不tr1::shared_ptr 和 auto_ ...
- More Effective C++ 35 条款
一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...
随机推荐
- 论文笔记《Tracking Using Dynamic Programming for Appearance-Based Sign Language Recognition》
一.概述 这是我在做手势识别的时候,在解决手势画面提取的时候看的一篇paper,这里关键是使用了动态规划来作为跟踪算法,效果是可以比拟cameshift和kf的,但在occlusion,gaps或者离 ...
- select函数详解
网络编程中一个很重要的函数,没有整理,直接转过来,讲的还是蛮详细的. 转自:http://blog.csdn.net/zhw888888/archive/2009/03/29/4034515.aspx ...
- [bzoj1051][HAOI2006]受欢迎的牛——强连通分量
题目大意: 给定一个有向图,求能够被其他所有点访问到的点的个数. 题解: 首先,这个题我在洛谷上AC了,但是bzoj上WA,不知道为什么. 说一下解法. 首先,我们进行scc分解,可以知道, 如果一个 ...
- 调试钩取技术 - 记事本WriteFile() API钩取
@author: dlive 0x01 简介 本章将讲解前面介绍过的调试钩取技术,钩取记事本的kernel32!WriteFile() API 调试钩取技术能进行与用户更具有交互性(interacti ...
- xpath和CSS选择器
.content是二进制 用来处理声音.图片.视频 .text是文本 xpath语法: /一层层查找 //不固定位置 //title/text() @选取属性 [@href]和[@href=''] . ...
- C++ bitset类的使用与简介 [转载]
有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值.位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法.标准库提供了bitset类使得处理位集合更容易一些.要使 ...
- mybatis之<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>的含义
转自:http://blog.csdn.net/qq_33054511/article/details/70490046 <trim prefix="" suffix=& ...
- 我和阿里云RDS的故事
于阿里云的RDS性能无法满足我们公司系统的要求,数据库偶尔出现莫名的查询慢(索引等做了全面优化)经过好多次投诉,情况还是没有改善.由于是类金融的系统,对这种情况是不能接受的.相信系统数据有5G以上有人 ...
- centos7安装gitlab与gitlab的汉化
Gitlab概述 GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. GitLab拥有与Github ...
- Laravel 添加自定义辅助函数
1. 在 app 目录下新建一个文件 helpers.php 2. 在 composer.json 文件的 autoload 字典中添加 "files":["app/he ...