in-class 初值设定
只支持整型常量
class static专属变量可以不定义,直接声明并使用
如果要取地址,就在定义文件里再定义const ,不要初始化,因为值在声明时已经默认了。
这不知道是哪个C++的版本加入的功能,旧编译器不支持初值
不支持in class时,可以用enum{NumTurns = 5}
替代
这叫做enum hack补偿做法
这是template metaprogramming的基本技术
bitwise constness(physical constness) and logical constness
二进制常量性 和 逻辑常量性 利用Mutable解决掉non-static的const摆动场,释放bitwise constness
新式转型
static_const转型操作
const_cast去除const操作
core dump错误
基类使用派生类函数 1. 使用virtual从继承向上移动 2. 使用安全容器
绝对拒绝cascading dynamip_cast,理由不理解
尽可能使用C++ style新式转型
无参数构造函数,为什么也需要用到初始化操作? (噢,可能是为了不忘记哪个参数不需要初值)
不同编译单元内定义之non-local static对象,编译器对初始化顺序并没有设定
**多个编译单元内的non-local static对象经由“模板隐式具现化 implicit template instantiations"”形成
将non-local 移到专属函数中,调用一个函数返回一个reference指向所含的对象,
这是Singleton模式的一个常见实现手法
但是在多线程环境下存在不确定性
做法:在程序的单线程启动阶段手工调用所有reference-returning函数,可消除与初始化有关的”竞速形式(race conditions)
编译器拒绝生成拷贝构造函数和操作符的几种情况
将成员函数声明为private并不去实现,就可以阻止编译器生成public拷贝构造函数等等
声明一个uncopyable基类,继承他就可以直接阻止编译器
c++的异常绝对不要放在析构函数里
连锁赋值
返回*this,这个是返回引用
自我赋值,释放,陷阱
传统做法,添加identity test
异常安全性是什么?
工厂函数factory function
RAII,资源取得时机便是初始化时机(Resource Acquisition is Initialization)
智能指针
或者 referenced counting smart pointer
resource handler
shared_ptr存在删除器,可以指定调用函数作为释放这种行为
std::tr1::shard_ptr<Investor> ptr
ptr(m1, Unlock)
有时APIs直接接触原始资源,无法通过资源管理类来接触
对原始资源的访问最好是通过显式转换,但是对客户来说,隐式转换 可能更加方便
隐式转换也是可以在自定义类中重载的吗?
以独立语句将newed对象存储于智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露
优良接口
许多客户端错误可以因为导入新类型而获得预防
以函数替换对象,表现某个特定月份
和non-local static对象的初始化次序有什么关系?
嗯,想起来了,构造函数的赋值和初始化次序可能不定,还是直接调用函数效果更确定
tr1::shared_ptr支持定制型删除器,可防范DLL问题,可被用来自动解除互斥锁。
这条不太理解,不知道DLL可能发生什么错误
设计class犹如设计type
函数内的static local对象何时释放? global slinton
在一个命名空间内添加多个头文件也是一种做法
特化版本是什么,好像没见过
条款25,特化swap,感觉不理解,特别复杂
避免返回handles(包括references、迭代器)指向对象内部
异常安全性
- 不泄露任何资源
- 不允许数据败坏
异常安全码
copy and swap一般化策略
pimpl idiom
function template和头文件是啥关系,似乎没啥关系
条款31 将文件件的编译依存关系降至最低
我们可以这样做,将person分割为两个classes,一个只提供接口,另一个负责实现该接口。
这样可以实现接口与实现相分离
std头文件依旧引用,除此之外。接口使用前置声明。
关键:用“声明的依存性”替换“定义的依存性”
Pass By Value就需要用到定义,而如果传递指针或引用,就不需要定义,只要声明
为声明式和定义式上提供不同的头文件
就像
这个被称为Handle classes.
2种: * 接口与实现相分离 * 抽象基类,叫interface class
类似Java的Interface
继承这个抽象基类的叫做具象类(concrete classes),调用基类的创建函数,在创建函数中调用具象类对象动态分配,并返回static,然后通过基类中提供的接口对返回的对象进行操作。哇,这也是一种接口与实现相分离
handle classes 和Interface classes解除了接口和实现之间的耦合关系,从而降低了文件间的编译依存性(compilation dependencies)
virtual意味着接口必须被继承,non-virtual意味着接口和实现必须被继承
转角函数 forwarding function
函数接口继承和函数实现继承
virtual和inline究竟有什么关系?
接口和缺省实现应该分开
可以在纯虚函数的定义中进行缺省实现
简朴的(非纯)impure vritual函数具体制定接口继承及缺省实现继承。
缺省实现继承不还是pure virtual函数实现的吗?
难道这个简朴的,指的不是virtual函数?
non-virtual interface(NVI手法),外覆器(wrapper)
Template Method设计模式
虚函数private,还能被继承吗?
不能的话,那有什么意义?
strategy设计模式
传递函数指针
tr1::function可以实现stategy设计模式
任何兼容的可调用物(callable entity)
与给定之目标签名式(target signature)兼容
上面2条什么意思?
非虚函数,Base类指针指向派生类,执行的函数式Base类中的,而不是派生类中的。
如果是虚函数,那么就都执行派生类中的。
静态绑定,动态绑定
dynamically bound,stataically bound
不能调用继承Private的virtual函数,那么允许重新定义这个虚函数的价值是什么呢?
如果继承的private是非虚函数,也是可以重新定义的吧?
难道这个不行
Java和C#自带 组织derived class 重新定义virtual 函数
空白基类最优化
多重继承
virtual inheritance
泛型编程
衍生出模板元编程
显式接口,运行期多态
template中指涉一个嵌套丛书类型名称,就必须在紧邻它的前一个位置放上关键字typename
模板 特化
全特化模板的调用很有可能编译器不会去查询,也就无法调用,存在一些问题
共性与变性分析
模板化基类 被覆盖
working set
因非类型模板参数造成的代码膨胀,可以用class来替换template,但是完全理解不了
Traits是一门技术,获取类型信息的,无论是内置还是自动类型
TMP元编程技术越来越牛了
可以定制new和delete,set_new_handler