Effective C++阅读笔记(一)
2015-07-01 17:27
253 查看
0. 导读
学习程序语言根本大法是一回事;学习如何以某种语言设计并实现高效程序设计是另一回事。术语:
声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节。
签名式(Dignature):(函数)参数和返回类型。
定义式(Definition):提供编译器一些声明式所遗漏的细节。
初始化(Initialization):给予对象初值的过程。
对象初始化:default构造函数 copy构造函数 pass by value
STL(Standard Template Library):标准模板库。
不明确行为(Undefined Behavior):无法稳定预估运行期会发生什么事。
接口(Interface):本书中是指函数的签名或class的可访问元素,或是针对某template类型参数需为有效的一个表达式。指的是一般性的设计观念。
客户(Client):~
ctor:构造函数
dtor:析构函数
命名习惯
- lhs:left-hand side
- rhs:right-hand side
- pt:pointer to T
- rw:reference to W
- mf:member function
重点内容
- TR1(Technical Report 1):一份描述加入C++标准程序库的诸多新机能的规范。
- Boost:网站,是一个提供可移植、同僚复审、源码开放的C++程序库。
1.让自己习惯C++
条款01:视C++为一个语言联邦
组成C++的四个次级语言(sublanguage):C
Object-Oriented C++
Template C++
STL
请记住:
C++高效编程守则视情况而变化,取决于你使用C++的哪一部分。
条款02:尽量以const,enum,inline替换#define
宁可以编译器替换预处理器,即尽量少用预处理器。编译过程:
Created with Raphaël 2.1.0.c文件预处理.i文件编译.o文件链接bin文件
情况一:对于单纯常量,最好以const对象或者enums替换#defines
例:[code]#define ASPECT_RATIO 1.653
替换为:
[code]const double AspectRatio = 1.653;
解释:记号名称ASPECT_RATIO也许从未被编译器看见,也许在编译器开始处理源代码之前它就被预处理器移走了。即编译源代码时ASPECT_RATIO已被1.653取代。ASPECT_RATIO可能并未进入记号表(symbol table)。
好处:进行了类型检查;代码量变小。
使用const替换#define时的两种特殊情况:
情况一: 定义常量指针
[code]const char* const name = "Lion";
或者直接使用string对象,相对方便:
[code]const std::string name("Lion");
情况二:类专属常量
[code]static const int NumTurns = 5; //static 静态常量,所有对象只有一份拷贝。
如果你使用的编译器不允许“static成员”在其声明式上获得初值,或者所谓的“in-class初值设定”也只允许对整数常量进行。你可以将初值放在定义式中:
[code]class CostEstimate{ private: static const double Ratio; ... }; const double CostEstimate::Ratio = 0.15;
还有一种例外就是当你在class编译期间需要一个class常量值,这是可以使用枚举型进行补偿,例如:
[code]class GamePlayer{ private: enum{ NumTurns = 5}; int scores[NumTures]; ... };
取一个const的地址是合法的,但取一个enum的地址就不合法,而取一个#define的地址通常也不合法。如果你不想让别人获取一个pointer或者reference指向你的某个整数常量,enum可以帮助你实现这个约束。
情况二:对于形似函数的宏(macros),最好改用inline函数替换#defines
例:[code]#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b)) int a = 5, b = 0; CALL_WITH_MAX(++a,b); //a被累加两次 CALL_WITH_MAX(++a,b+10); //a被累加一次
替换为:
[code]template<typename T> inline void callWithMax(const T& a, const T& b) { f(a>b?a:b); }
(未完待续,2015年7月1日)
相关文章推荐
- 【学习笔记】【C语言】宏定义
- 自学笔记-C语言复习2015年7月1日
- c/c++模板的定义和实现分开的问题(一)
- c++ primer读书笔记-第六章 语句
- c语言堆栈说明
- 站在巨人的肩膀上,C++开源库大全
- KMP模式匹配算法 分类: C/C++ 2015-07-01 16:41 150人阅读 评论(0) 收藏
- C语言中关于环境变量的函数
- 【C语言】编写一个函数,求字符串长度
- 《c++ primer》第五版 第15章 面向对象程序设计
- 黑马程序员——C语言之模块化编程与进制转换
- C++ 备忘录
- Effective C++:规定24:如果所有的单位都需要的参数类型转换,使用请做到这一点non-member功能
- STL Support Tools
- 《c++ primer》第五版 第十四章 重载运算和类型转换 笔记
- chapter15test3
- c++ vector
- chapter15test2
- 弄清C++在幕后为你所写、所调用的函数
- 12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!