Effective C++ 学习记录
2015-07-24 09:02
381 查看
1.以by value 传递用户自定义类型通常是个坏主意,Pass-by-reference-to-const往往是比较好的选择
一、让自己习惯C++
条款02:尽量以const,enum,inline替换#define
(1)对于单纯常量,最好以const对象或enums替换#defines。
示例:
#define ASPECT_BATIO 1.653
改为
const double AspectRatio 1.653;
好处:作为一个语言常量,AspectRatio 会被编译,会进入记号表内。使用常量可能比使用#define导致较小量的目标码。
(2)对于形似函数的宏(macros),最好改用inline函数替换#defines
示例:
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
改为:
template <typename T>
inline void callWithMax(const T&a,const T& b)
{
f(a>b ? a:b);
}
好处:更加可预料,更加类型安全
条款03:尽可能使用const
(1) 将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
(2) 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)
(3) 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。
条款04:确定对象被使用前已先被初始化
C++成员初始化次序:base classes 更早于其derived classes 被初始化,而class的成员变量总是以其声明次序被初始化。
(1) 为内置型对象进行手工初始化,因为C++不保证初始化它们。
(2) 构造函数最好使用成员初值列(member initialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列
列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
(3) 为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static 对象。
一、让自己习惯C++
条款02:尽量以const,enum,inline替换#define
(1)对于单纯常量,最好以const对象或enums替换#defines。
示例:
#define ASPECT_BATIO 1.653
改为
const double AspectRatio 1.653;
好处:作为一个语言常量,AspectRatio 会被编译,会进入记号表内。使用常量可能比使用#define导致较小量的目标码。
(2)对于形似函数的宏(macros),最好改用inline函数替换#defines
示例:
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
改为:
template <typename T>
inline void callWithMax(const T&a,const T& b)
{
f(a>b ? a:b);
}
好处:更加可预料,更加类型安全
条款03:尽可能使用const
(1) 将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
(2) 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)
(3) 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。
条款04:确定对象被使用前已先被初始化
C++成员初始化次序:base classes 更早于其derived classes 被初始化,而class的成员变量总是以其声明次序被初始化。
(1) 为内置型对象进行手工初始化,因为C++不保证初始化它们。
(2) 构造函数最好使用成员初值列(member initialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列
列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
(3) 为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static 对象。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解