Effective C++阅读笔记(一)

本文是Effective C++阅读笔记的第一部分,作者强调应将C++视为由C、Object-Oriented C++、Template C++和STL组成的语言联邦,并推荐使用const、enum和inline代替#define,以实现类型检查和避免预处理器的潜在问题。文章详细探讨了如何在不同场景下用const对象、枚举和inline函数替换#define,以提高代码质量和可维护性。
摘要由CSDN通过智能技术生成

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

例:

#define ASPECT_RATIO 1.653

替换为:

const double AspectRatio = 1.653;

解释:记号名称ASPECT_RATIO也许从未被编译器看见,也许在编译器开始处理源代码之前它就被预处理器移走了。即编译源代码时ASPECT_RATIO已被1.653取代。ASPECT_RATIO可能并未进入记号表(symbol table)。
好处:进行了类型检查;代码量变小。

使用const替换#define时的两种特殊情况:

情况一: 定义常量指针
const char* const name = "Lion";

或者直接使用string对象,相对方便:

const std::string name("Lion");
情况二:类专属常量
static const int NumTurns = 5;  //static 静态常量,所有对象只有一份拷贝。

如果你使用的编译器不允许“static成员”在其声明式上获得初值,或者所谓的“in-class初值设定”也只允许对整数常量进行。你可以将初值放在定义式中:

class CostEstimate{
private:
    static const double Ratio;
    ...
};
const double CostEstimate::Ratio = 0.15;

还有一种例外就是当你在class编译期间需要一个class常量值,这是可以使用枚举型进行补偿,例如:

class GamePlayer{
private:
    enum{ NumTurns = 5};
    int scores[NumTures];
    ...
};

取一个const的地址是合法的,但取一个enum的地址就不合法,而取一个#define的地址通常也不合法。如果你不想让别人获取一个pointer或者reference指向你的某个整数常量,enum可以帮助你实现这个约束。

情况二:对于形似函数的宏(macros),最好改用inline函数替换#defines

例:

#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被累加一次

替换为:

template<typename T>
inline void callWithMax(const T& a, const T& b)
{
    f(a>b?a:b);
}

(未完待续,2015年7月1日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值