此书目的:介绍c++编程方向与观点,如何规避编译器难以显露的问题
彻底了解c++如何行为,为什么那样行为,以及如何运用其行为形成优势
要求:了解每个条款背后的原理,恰当的套用所开发的软件中
术语
声明式:告诉编译器某个东西的名称和类型,但是略细节
extern int a;
签名式:每个函数的声明揭示了其签名式,也就是参数和返回类型--如std::size_t (int)
定义式:提供编译器一些声明式所遗漏的细节,对对象而言定义式是编译器为此对象拨发内存的地点
int a; 是一个定义型声明
定义分配具体的内存,声明不分配;定义只能有一个,声明可以有多个
std:这个命名空间几乎是所有的c++标准程库元素的栖身处
初始化:给对象初值,对于类类型,初始化由构造函数执行
关键字explicit
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。
C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。
1 是个构造;2 是个默认且隐含的类型转换操作符。
所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。
这样看起来好象很酷, 很方便。 但在某些情况下, 却违背了程序员的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用/使用, 不能作为类型转换操作符被隐含的使用。
解析:explicit构造函数是用来防止隐式转换的。
默认构造,拷贝构造,拷贝赋值运算符
运行结果图
拷贝构造和赋值运算符的本质区别:是否有新对象被定义
如果一个新对象被定义则调用拷贝构造(或默认构造);如果此对象已经被定义,则调用赋值运算符
TR1和Boost
TR1:Technical Report是一份规范,描述加入c++标准程序库的诸多新机能,以类模板和函数模板的形式体现。
Boost:是个组织,提供可移植,源码开放的c++程序库。大多数TR1机能是以Boost的工作方式为基础的