[C++ 学习笔记 7] Effective C++ 条款 1-4

原创
2017/01/29 17:28
阅读数 145

第一章 让自己习惯 C++

1、视 C++ 为一个语言联邦

    C++ 是个多重范型编程语言:面向过程、面向对象、函数式、泛型、原编程式,所以他的规约很多,记住四个次语言可以帮助了解 C++:C、Object-Oriented C++、Template C++、STL。

2、尽量以 const、enum、inline 替换 #define

    他们的根本差别是:前三者是编译器处理的,最后者是预处理器处理的。enum 比 const 更像 #define,比如说 const 定义通常可以求地址或引用,而 enum 不行。

    inline 函数比宏多了类型安全和可预料性,一个例子是讲 i++ 或 ++i 当参数传给宏时,可能导致 ++ 了多次,而传给 inline 函数则不会。

3、尽可能使用 const

    const 可以帮助编译器侦测错误的用法。例如,令函数返回一个常量值,往往可降低因调用者错误而造成的意外,而又不至于放弃安全性和高效性。比如当比较语句少写了一个 = 时:

if (a * b = c) ... // 本意是 ==,结果导致在 a * b 的临时变量上调用 operator=

    如果 operator= 返回值不是 const 会导致以上错误代码编译通过!

    bitwise constness 认为 const 成员函数不可以更改对象内任何 non-static 成员变量,logical constness 主张在调用者侦测不出的前提下可以修改对象内某些 bits,可以利用 mutable 释放掉 non-static 成员变量的 bitwise constness 约束。

    在 const 和 non-const 成员函数中避免重复的做法是:让 non-const 成员函数调用 const 成员函数,而不要反过来。

4、确定对象被使用前已被初始化

    为内置型对象进行手工初始化,因为 C++ 不保证初始化它们。

    构造函数最好使用成员初值列,而不是赋值操作,排列顺序最好和声明次序想同。

    为避免跨编译单元的初始化次序问题,用 local static 对象代替 non-local static 对象,参考 Singleton 模式常见实现。

XClass& GetInstance()
{
    static XClass instance;
    return instance;
}

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部