【读书笔记】Effective C++ 条款1~2 核心编程准则

目录

条款1:视C++为一个语言联邦

示例对比

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

#define的常见用法

#define的问题

解决方案

[1. 使用const替换常量宏](#1. 使用const替换常量宏)

[2. 类内的静态常量整型](#2. 类内的静态常量整型)

[3. 使用inline替换宏函数](#3. 使用inline替换宏函数)

总结


条款1:视C++为一个语言联邦

C++是一个由多个次语言组成的整体,主要包括:

  1. C语言部分:数组、指针、预处理等

  2. 面向对象编程:类、继承、虚函数等

  3. 模板编程:泛型编程

  4. STL:容器、迭代器、算法等

当在这些次语言间切换时,高效编程的要求可能会改变。

示例对比

C风格函数:传值开销小

cpp 复制代码
void fun2(int a)  // 复制int的开销忽略不计
{
}

C++类对象:传引用更高效

cpp 复制代码
class Student
{
private:
    string name = "张三";
    string gender = "男";
    int id = 0;
};

void func(Student& s)  // 传引用避免拷贝开销
{
}

每个次语言都有自己的规约,理解这一点有助于编写更高效的C++代码。

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

#define的常见用法

  1. 定义常量
复制代码
#define NUM 5
  1. 定义宏函数
复制代码
#define MAXNUM(A,B) ((A)>(B)?(A):(B))

#define的问题

  • 宏会直接文本替换,编译错误信息难以理解

  • 宏函数容易产生意外的副作用

  • 无脑展开可能导致代码膨胀

解决方案

1. 使用const替换常量宏
复制代码
const int num = 5;

特殊情况:常量字符串

复制代码
const char* const str = "hello";  // 指针和内容都不可修改
2. 类内的静态常量整型

常规写法

复制代码
class C
{
private:
    static const int _a = 1;  // 现代编译器支持
public:
    int a[_a];
};

对于老旧编译器,使用enum hack

复制代码
class C
{
private:
    enum { _a = 5 };  // 使用匿名枚举替代
public:
    int a[_a];  // 可以正常使用
};

优点:enum hack不能取地址,更安全。

3. 使用inline替换宏函数

有问题的宏函数

复制代码
#define MAXNUM(A,B) ((A)>(B)?(A):(B))

问题示例:

复制代码
int a = 1, b = 2;
MAXNUM(++a, b);     // a可能被多次递增
MAXNUM(++a, b+5);   // 更复杂的副作用

改为inline函数

复制代码
inline int maxnum(int a, int b)
{
    return a > b ? a : b;
}

或使用模板:

复制代码
template<typename T>
inline T maxnum(const T& a, const T& b)
{
    return a > b ? a : b;
}

总结

使用const、enum、inline替代#define的优势:

  1. 更好的类型检查:编译器能进行类型检查

  2. 更清晰的错误信息:调试更容易

  3. 避免副作用:inline函数参数只计算一次

  4. 作用域控制:const和enum有明确的作用域

  5. 更好的调试体验:调试器能看到符号名

遵循这些准则能让你的C++代码更安全、更易于维护。

相关推荐
utf8mb4安全女神9 分钟前
【rsyslog服务】把所有服务的“临界点”以上的错误都保存在/var/log/alert.log⽇志中
java·前端·javascript
带刺的坐椅16 分钟前
Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
java·http·solon·jetty·undertow
郝学胜-神的一滴18 分钟前
干货版《算法导论》07:递归视角下的选择排序与归并排序
java·数据结构·c++·python·程序人生·算法·排序算法
YY&DS23 分钟前
Qt 嵌入 CEF 在 Linux 下必须设置 `QT_XCB_GL_INTEGRATION=xcb_egl才能加载网页
linux·开发语言·qt
csdn_aspnet26 分钟前
javascript 算法 LeetCode 编号 70 - 爬楼梯
开发语言·javascript·算法·leetcode·ecmascript
掉鱼的猫31 分钟前
Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
java·http
shehuiyuelaiyuehao32 分钟前
多线程入门
java·python·算法
星夜夏空9932 分钟前
FreeRTOS学习(7)——任务列表
java·前端·学习
han_hanker38 分钟前
BeanUtils.copyProperties 和序列化的问题
java·开发语言·spring boot
野生技术架构师41 分钟前
牛客网2026互联网大厂Java面试题汇总,附官方级答案解析
java·开发语言