首页 > 编程语言 >Effective C++读书笔记——item2(const,enum,inlines取代#define)

Effective C++读书笔记——item2(const,enum,inlines取代#define)

时间:2025-01-03 12:05:29浏览次数:3  
标签:const 定义 Effective 常量 函数 读书笔记 编译器 define

关于用常量取代 #define 的总体原则

在编程中,应尽量减少预处理器(特别是 #define)的使用,可通过合适的替代方式来避免 #define 带来的诸多问题,虽然不能完全消除预处理器相关指令(如 #include、#ifdef/#ifndef 仍有重要作用),但要让其使用频率降低。

简单常量方面

  1. 问题阐述
    使用 #define 定义常量存在诸多弊端,比如编译器在预处理阶段就将宏名称替换掉,使得该名称不会加入符号表,当出现常量使用错误时,错误信息中显示的是替换后的具体值,不利于查找错误源头,在符号调试器中也会因名字未加入符号表而出现类似问题。而且对于浮点常量,使用 #define 还可能导致目标代码中存在多个相同值的拷贝,增加代码量。
  2. 解决方法
    用 const 对象来取代 #define 定义的简单常量,例如const double AspectRatio = 1.653;,这样的常量能被编译器明确识别并加入符号表,对于浮点常量还能减少代码量。

特殊情况的常量定义

  1. 常量指针相关
    在头文件中定义常量指针(如基于 char * 的字符串常量)时,要注意将指针本身也声明为 const,像const char * const authorName = "Scott Meyers";。不过通常更推荐使用std::string类型来定义字符串常量,如const std::string authorName("Scott Meyers");
  2. 类属常量相关
    若要将常量作用范围限制在类内,需将其作为类的静态成员来声明,对于静态的整型族(如整数、字符、布尔型)类属常量,只要不获取其地址,可只声明不定义就能使用(如class GamePlayerstatic const int NumTurns = 5;声明后可直接在类内使用)。若需要获取地址或者编译器要求必须定义,则要在实现文件中给出定义(如const int GamePlayer::NumTurns;)。对于较老编译器不支持类内初始化语法的情况,可将初始值放在定义处。另外,还有 “the enum hack” 这种替代方法(如class GamePlayerenum { NumTurns = 5 };),它有类似 #define 不能取地址的特点,且在模板元编程等场景有应用,还不会导致不必要的内存分配,很多代码中会使用到这种方式。

类似函数的宏方面

  1. 问题阐述
    使用 #define 定义类似函数的宏(如#define CALL_WITH_MAX(a, b) f((a) > (b)? (a) : (b)))存在很多缺点,比如需要给宏体中的参数都加上括号来避免在表达式中调用时出现意外情况,但即便如此,仍可能出现参数解析次数等不可预测的问题,像宏调用时参数递增次数会因比较对象不同而变化。
  2. 解决方法
    使用内联函数模板来替代类似函数的宏,例如定义template<typename T> inline void callWithMax(const T& a, const T& b),它能获得宏的效率,同时具备完全可预测的行为以及常规函数的类型安全,还遵循函数的作用范围和访问规则。

总之,对于简单常量,用 const 对象或 enums 取代 #define;对于类似函数的宏,用内联函数取代 #define,以此提升代码的质量和可维护性等方面表现。

标签:const,定义,Effective,常量,函数,读书笔记,编译器,define
From: https://blog.csdn.net/weixin_46032775/article/details/144896846

相关文章

  • 2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情
    2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情屈原班婕妤曹植刘绘卢思道卢照邻苏味道刘希夷李白高适杜甫司空曙白居易温庭筠韦庄窦叔向张泌林逋柳永晏殊欧阳修李觏舒亶秦观陈瓘李清照陆游辛弃疾姜夔蒋捷吴伟业纳兰性德张惠言邓廷桢《飞花令·合》......
  • 读书笔记~管理修炼~避免无意义的内卷
      剧场效应:避免无意义的内卷   电影院里,大家都在认真看电影。忽然,有一个观众站了起来,或许是想看得更清楚,或许是因为前面的人太高挡住了他。他站起来后,他后面的人也站了起来,然后陆陆续续周围的人都站了起来。最后,电影院里的人都站了起来,每个人都累,却没有得到更多的好处......
  • 读书笔记~管理修炼-学会往前看
    反事实思维:学会往前看   “要是早出门半小时就好了,现在就不会错过飞机了。”   “要是刚才没买那件衣服就好了,现在就能买这件了。”   “要是……就好了”,这样的句式出现,大概率代表了一种思维模式——反事实思维。   反事实思维是诺贝尔经济学奖丹尼尔......
  • 读书笔记3
    《程序员的修炼之道:从小工到专家》第八章主要探讨了如何进行有效的软件项目管理,以及在项目管理中的最佳实践。以下是这一章节的读书笔记,总结了重要观点和概念。软件开发不仅仅是编写代码,良好的项目管理是确保项目成功的关键要素。项目管理涵盖了计划、执行、监控和收尾等整个过程......
  • 读书笔记2
    《程序员的修炼之道:从小工到专家》的第七章主要集中在与他人协作的艺术,关注团队合作及沟通技巧在软件开发中的重要性。以下是这一章节的读书笔记,概述了主要观点和关键概念。在现代软件开发中,程序员通常不再单打独斗,团队合作是取得成功的关键。成功的软件项目常常依赖于团队成员之......
  • 读书笔记
    《程序员的修炼之道:从小工到专家》的第六章主要集中在如何持续学习与自我提升。以下是这一章节的读书笔记,概述了其中的一些主要观点和概念。程序员的职业生涯中,技术是不断发展的,学习新技术和工具已成为必然。提升自己的技能是走向专家之路的重要一步。持续学习不仅可以增广自己的......
  • Effective C++ 条款40:明智而审慎地使用多重继承
    文章目录条款40:明智而审慎地使用多重继承示例1:多重继承中的歧义示例2:避免菱形继承问题示例3:合理使用多重继承总结条款40:明智而审慎地使用多重继承多重继承(MultipleInheritance)允许一个类从多个基类继承。然而,与单一继承相比,多重继承更加复杂,可能带来以下问题和......
  • 《程序员修炼之道:从小工到专家》读书笔记(七)
    这一次读书笔记是关于第六章“当你编码时”,第六章章深入探讨了实际编码过程中的一系列实用技巧和最佳实践,聚焦程序员在日常编写代码过程中的思维模式与注意事项,助力开发者产出高质量、易维护、可读性强的代码,将前期积累的设计理念、应对变化策略落实到指尖敲击的每一行字符中,是从......
  • 引用与常量 - 引用类型、const关键字
    引言在C++中,引用和const关键字是两个非常重要的概念。引用提供了一种方便的方式来操作变量的别名,而const关键字则用于定义不可修改的常量或指针。正确理解和使用这两个特性可以提高代码的安全性和可读性。本文将详细介绍引用的基本概念和操作,以及const关键字的各种用法,帮助初......
  • 《程序员修炼之道:从小工到专家》读书笔记(六)
    这篇读书笔记是关于第五章“弯曲,或折断”,这是一个富有哲理的章节,它通过一个形象的比喻,传达了在软件开发过程中应对变化和压力的重要原则。这一章的核心思想是强调在面对不可避免的变化和挑战时,程序员应该学会“弯曲”——即灵活地适应和调整,而不是固执地抵抗以至于“折断”。弯曲......