标签:
本周内,每天更新。
C++的特性主要来源四个大方面(四个次语言)
以C为基础
Object-oriented C++:面向类的思想,包括封装、继承、多态
Template C++:
模板类 STL
结论:
坏处
define不被视为语言的一部分,在预编译的时候可能就被对应数据和字符取代,编译器看不到相关的记号
宏定义的函数存在非安全性
用const取代
定义常量指针:注意const的放置
class专属常量:可以声明的同时初始化;也可以在实现文件内初始化
用enum取代
无法取对应的地址(#define也得到,功能相似)
不想别人获得pointer或reference指向该资源
用inline取代
结论:
对于单纯常量,最好以const对象或enums替换#defines
对于形如函数的宏,最好改用inline函数替换
注意:
const出现在型号左边,表示被指物是常量;在右边表示指针自身是常量
STL的静态指针: const std::vector::iterator 表示指针自身是常量,不能++;std::vector::const_iterator 表示被指物是常量
const成员函数
是为了确认该成员函数可作用于const对象身上
真实程序中,const大多用于passed by pointer-to-const或passed by reference-to-const
bitwise constness(编译器就是这种)和logical constness:
bitwise constness是成员函数只有在不更改对象的任何成员变量时就认为是符合const,这个定义存在一定不足,因为即使编译器查不出更改也可能存在更改
logical constness是一个const成员可以修改它所处对象内的某些bits,但只有在客户端侦测不出的情况下才可以
通过mutable关键字,可以释放掉non-static成员变量的bitwise constness约束,从而在const函数内也可以修改所在对象的mutable成员变量
在const和non-const成员函数中避免重复
结论:
将某些东西声明为const可帮助编译器真测出错误用法编译器强制实施bitwise constness, 但编程应该使用“概念常量性”(具体问题具体分析,编译器不可靠的意思)
当const和non-const成员函数存在等价实现,用non-const函数调用const版本可以避免代码重复
手工初始化:
构造函数最好使用成员初值列,而不要在构造函数内赋值操作。初值列列出的成语变量,其排列次序应该和它们在class中的声明次序相同
要区分赋值和初始化,对于class的对象,在构造函数内赋值实际上是先调用了它们的默认构造函数,然后做赋值操作,比较低效
成员的初始化列表本质是调用复制构造函数,效率较高
规则:总是在初值列中列出所有成员变量,以免还需记住那些成员变量无需初值
为了免除“跨编译单元之初始化次序”的问题(就是定义文件之间的初始化没有先后顺序),应该以local static对象替换non-local static对象
non-local static:函数外的static对象就是non-local static变量
编译单元:产出单一目标文件的源码,基本上它是单一源码文件加上其所含的头文件
问题:C++对于不同编译单元内的non-local static对象的初始化次序没有明确定义
解决:用singleton的思想。将每个non-local static变量搬到专属函数内,这些函数返回一个reference指向它所含的对象,然后用户调用这些函数,不直接调用对象。这时,non-local static变成了local static
这种reference-returning函数的形式:定义并初始化一个local static, 然后返回它
标签:
原文地址:http://blog.csdn.net/hubin232/article/details/51356790