Effective C++阅读笔记条款01C++语言联邦,02const,enum,inline替换#define

本文探讨了C++作为一门融合多种编程范式的语言的特点,并提供了高效编程建议,比如使用const、enum和inline替代预处理器指令#define,以及如何正确声明和初始化类中的静态常量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条款1,C++不仅仅是一C语言加入了面向对象特性的高级语言。

发展到现在C++可被称为多重泛型编程语言,一个同时支持过称形式,面向对象形式,函数形式,泛型形式,元编程形式de语言。

如果要正确理解C++,最好将其视为一个语言联邦。该联邦由4个子语言模块组成。

C,Object-Oriented C++,Template C++,STL.具体内容根据字面意思大体了解即可。只有一点值得注意,迭代器和函数对象都是在C指针之上塑造出来的,所以对STL的迭代器和函数对象而言,旧式的C pass-by-value守则再次适用。

PS:高效编程守则视状况而变化,取决于你适用C++哪一部分。

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

该条款或许可以改为“宁可以编译器替换预处理器”,或许因为#define不被视为语言的一部分。

之前:#define ASPECT_RATIO 1.653 预处理器盲目将宏名称ASPECT_RATIO替换为1.653可能导致目标码出现多份1.653

之后:const double AspectRatio =1.653  这样不会出现。

Class GamePlayer{

private:

static const int NumTurns = 5;

int scores[NumTurns[;

}

1.首先#define 无法创建一个class专属常量,因为#define不重视作用域,且不提供任何封装性,如private #define

2.NumTurns只是声明式,而不是定义式。两种情况要有定义式。a,取某个class专属常量的地址,b,编译器(不正确地)坚持要看到一个定义式。

此时,要在实现文件,而非头文件中加入 const int GamePlayer::NumTurns;

3.inclass 初值设定,只允许对整数常量进行。如果编译器不支持上述语法,可以将初值放在定义式。

class CostEstimate{

private:

static const double FudgeFactor;

}


const double ConstEstimate::FudgeFactor = 1.35.

如果编译器(错误地)不允许“static整数型class常量”完成“inclass初值设定”,可改用“the enum hack”补偿做法。

理论基础是:“一个属于美剧类型的数值,可权充ints被使用”,于是:

class GamePlayer{

private:

enum{NumTurns = 5};

int score[NumTurns];

}

同时要知道对#define 和 enum取地址不合法。

如果不想让别人活得一个pointer或reference只想你的某个整数常量,enum可以实现。不会导致非必要的内存分配。

enum hack是template metaprogramming模板元编程的基础技术。

#define CALL_WITH_MAX(a, b) f(a>b?a:b)

int a = 5,  b = 0;

CALL_WITH_MAX(++a, b) a被累加2次

CALL_WITH_MAX(++a, b+10) a被累加1次


template<typename T>

inline void callWithMax(const T &a, const T &b)

{

f(a>b?a:b)

}


PS:1.对于单纯常量,最好以const对象或enum替换#define

2.对于形似函数的宏,最好改用inline函数替换#define



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值