IE盒子

搜索
查看: 120|回复: 0

掌握 Effective C++ : 条款02

[复制链接]

4

主题

10

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-4-9 20:54:28 | 显示全部楼层 |阅读模式
前言

《Effective C++》 是每个 C++ 程序员都应该读的经典之作,书中涵盖了 C++ 编程中的一系列最佳实践,包括了面向对象设计、模板、STL、异常处理等方面的内容。
由于 C++ 的发展非常迅速,书中的某些内容可能已经过时,但依然是值得好好学习的一本书。通过本书的阅读,读者能够掌握 C++ 编程的精髓,写出高效且健壮的代码。
本系列文章会对书中每项条款进行整理,以便在未来想要回顾某一条款的内容时可以最大限度地节约时间。
背景

条款02

条款 02:尽量以 const,enum,inline 替换 #define。
本文是对书中第二条款的学习整理,主要介绍了如何使用 const、enums、inline 来提高 C++ 代码的效率和可读性。
#define

#define 是C语言中常用的预处理器指令,用于定义常量或宏。但在 C++ 中,使用 #define 有一些缺点:

  • #define 定义的常量或宏没有进入符号表,因此在调试时无法跟踪,也可能造成命名冲突。
  • #define 定义的宏没有类型检查,容易引起错误或不可预期的结果。
  • #define 定义的宏可能导致多次代码展开,增加编译时间和目标代码大小。
const

const 是一个常用的修饰符,它可以用来声明常量、常量指针、常量引用、常量成员函数等。const 的作用是限制变量或对象的修改,从而保证数据的安全性和一致性。const 还可以帮助编译器进行优化,提高程序的运行速度。
enums

enums 是一种枚举类型,它可以用来定义一组有名字的整数常量。enums 的优点是可以提高代码的可读性和可维护性,避免使用魔法数字或宏定义。enums 还可以用来实现类似于 C 语言中的 #define 的功能,例如:
enum { NumTurns = 5 }; // NumTurns是一个符号名称,不会占用内存空间
int scores[NumTurns]; // 使用enum代替#define定义数组大小
inline

inline 是一个函数修饰符,它可以用来建议编译器将函数体直接嵌入到调用处,从而减少函数调用的开销。inline 函数通常适用于简短且频繁调用的函数,例如:
inline int max(int a, int b) // 定义一个inline函数
{
  return a > b ? a : b;
}

int x = max(3, 5); // 调用inline函数,相当于直接替换为int x = 3 > 5 ? 3 : 5;
使用 const 替换 #define

使用 const 替换 #define 的主要原因在于 const 定义的常量具有类型和作用域,使得代码更加健壮和可维护。
类型检查

const 定义常量时需要指定数据类型,编译器可以对其进行类型检查,避免了一些因类型不匹配而导致的错误;
#define 定义常量是一个简单的文本替换,没有类型检查,使用不当可能会引发错误。
代码可读性

const 定义常量在代码中具有更好的可读性和可维护性;
#define 宏定义更显得冗长和不直观,使用 const 可以使代码更加简洁和清晰。
作用域限定

const 定义常量具有作用域,只在定义它的作用域内有效,避免了因命名冲突而产生的错误;
#define 定义常量没有作用域限制,一旦在某个文件中定义了一个常量,它就会影响到该文件中的所有代码,甚至可能影响到其他文件。
代码调试

const 定义常量可以在调试过程中通过打印输出等方式调试;
#define 定义常量时,常量会直接替换成值,不便于在调试过程中对常量进行调试,很难得知该常量的值是否正确。
优化机制

编译器可以对 const 常量进行优化,因为 const 常量是一个变量,在编译期间是一个确定的值,可以被放入 ROM 中,这样可以节约内存空间;
使用 #define 定义常量时,只是一个文本替换,不适合编译器优化,性能不如使用 const。
使用 enum 替换 #define

同 #define,enum 也可以用来定义常量和枚举,并且 enum 值也不占用内存空间、不可取地址。
可读性更高

使用枚举类型定义符号常量,可以更加清晰地表达代码的含义,提高了代码的可读性和可维护性。
类型安全

枚举类型是一种具有类型的变量,编译器可以对其进行类型检查,避免了因类型不匹配而引发的错误。
作用域限定

使用 #define 定义常量时,常量名会被替换为相应的值,可能会影响到命名空间。而使用枚举类型定义常量,则不会对命名空间造成影响。
自动生成常量值

如果枚举常量没有被显式地赋值,编译器会自动产生一个常量值,便于程序员使用。
位运算

枚举类型可以进行运算,例如可以进行比较、加减、位运算等操作,可以增强程序的可扩展性和可移植性。
使用 inline 替换 #define

普通的函数在每次调用时都会有一定的开销,比如参数传递、栈帧分配、跳转指令等。
inline 函数是一种在编译时期进行代码展开的函数,可以替代使用 #define 定义的宏。
类型安全

inline 函数可以进行类型检查,避免了使用宏定义时出现的类型不匹配的问题。
更好的可读性

inline 函数可以使用函数的语法结构,更加符合程序员的习惯,代码可读性更好。
可调试性

使用 inline 函数可以方便调试,因为调试器可以直接跳转到函数的源代码中,而使用宏定义时只能跳转到宏定义的位置。
代码复用性

inline 函数可以像普通函数一样进行调用,可以在多个位置进行复用,而宏定义只能在定义的文件中使用。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表