当前位置: 首页 > news >正文

effective c++ 条款2

条款2

  • 常量(const)替换宏(#define)
    • 指针常量
    • 类成员常量
  • 枚举(enum)替换宏(#define)
  • 模板函数(template inline)替换宏函数

尽量用const,enum,inline替换#define

在这里插入图片描述
总结就是:
在这里插入图片描述

常量(const)替换宏(#define)

// uppercase names are usually for macros
#define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;

指针常量

双const:指针不能变(只能指向这一块内存空间),指向的内存单元的值也不能变。

	std::cout << "测试常量指针" << std::endl;const char* const authorName1 = "StevePro Studios";   //c类型字符串 char*   std::cout << *(authorName1 + 0) << *(authorName1 + 1) << std::endl;char* const authorName12 = "StevePro Studios2";authorName12[2] = 'x';  //指针只能指向S的地址(值可变)  authorName12[2] =nullptr;不可修改const char* authorName13 = "StevePro Studios3";authorName13 = nullptr; //指针可以指向其他内存空间,但内存空间中的值不能变。  authorName13[2] = 'x';不可修改

或者可以使用string常量代替:

	std::cout << "string常量" << std::endl;const std::string authorName2("StevePro Studios");    //c类型字符串 string

在这里插入图片描述

类成员常量

  1. 类的静态成员
  2. 在头文件声明,在cpp文件中定义

在这里插入图片描述
在这里插入图片描述
这样也就完成了常量的定义。

	std::cout << GamePlayer1::NumTurns << std::endl;GamePlayer2 g2;std::cout << g2.scores << std::endl;

可以在其他函数中,直接调用常量GamePlayer1::NumTurns。
在这里插入图片描述

枚举(enum)替换宏(#define)

在这里插入图片描述
在这里插入图片描述

也可以在其他函数中直接使用常量:

	GamePlayer2 g3;std::cout << g3.NumTurns << std::endl;

模板函数(template inline)替换宏函数

#include <iostream>#include "GamePlayer1.h"
#include "GamePlayer2.h"
// uppercase names are usually for macros
#define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;int f(int parm) {std::cout << parm << std::endl;return parm;
}#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))// We don't know what T is so pass by reference-to-const	Item20
template<typename T>
inline void callWithMax(const T& a, const T& b)
{f(a > b ? a : b);
}int main()
{std::cout << "测试常量指针" << std::endl;const char* const authorName1 = "StevePro Studios";   //c类型字符串 char*   //std::cout << *(authorName1 + 0) << *(authorName1 + 1) << std::endl;//char* const authorName12 = "StevePro Studios2";//authorName12[2] = 'x';  //指针只能指向S的地址(值可变)  authorName12[2] =nullptr;不可修改//const char* authorName13 = "StevePro Studios3";//authorName13 = nullptr; //指针可以指向其他内存空间,但内存空间中的值不能变。  authorName13[2] = 'x';不可修改std::cout << "string常量" << std::endl;const std::string authorName2("StevePro Studios");    //c类型字符串 stringstd::cout << "测类中的静态常量" << std::endl;std::cout << GamePlayer1::NumTurns << std::endl;GamePlayer2 g2;std::cout << g2.scores << std::endl;std::cout << "测类中的枚举" << std::endl;GamePlayer2 g3;std::cout << g3.NumTurns << std::endl;std::cout << "测试#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))" << std::endl;int a = 5; int b = 2;CALL_WITH_MAX(++a, b);  std::cout << "a的值最后为: " << a << std::endl;a = 5; b = 2;CALL_WITH_MAX(++a, b + 10);   std::cout << "a的值最后为: " << a << std::endl;std::cout << "使用模板后" << std::endl;a = 5; b = 2;callWithMax(++a, b);a = 5; b = 2;callWithMax(a, b+10);return 0;
}

在这里插入图片描述
宏函数存在的问题
在这里插入图片描述

解决办法:
在这里插入图片描述

http://www.lryc.cn/news/95363.html

相关文章:

  • Python爬虫之Scrapy框架系列(23)——分布式爬虫scrapy_redis浅实战【XXTop250部分爬取】
  • html基于onmouse事件让元素变颜色
  • Linux环境PostgreSQL安装
  • Rust 数据类型 之 结构体(Struct)
  • 数据结构之Queue的实现
  • rust声明式宏
  • 第二章:Learning Deep Features for Discriminative Localization ——学习用于判别定位的深度特征
  • 【CSS】box-shadow 属性
  • 基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)
  • Mysql错误日志、通用查询日志、二进制日志和慢日志的介绍和查看
  • 【Linux】Tcp服务器的三种与客户端通信方法及守护进程化
  • 【Spring Cloud】git 仓库新的配置是如何刷新到各个微服务的原理步骤
  • 三,创建订单微服务消费者 第三章
  • 【雕爷学编程】Arduino动手做(87)---ULN2003步进电机模组2
  • 【C#】微软的Roslyn 是个啥?
  • 两个小封装电机驱动芯片:MLX813XX、A4950
  • 数据结构【绪论】
  • 掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作等
  • Angular中组件设计需要注意什么?
  • 电容触摸屏(TP)的工艺结构
  • Qt小妙招:如何在可执行文件生成后,在pro文件中添加其他命令操作?
  • 做好防雷检测的意义和作用
  • 计算机启动过程uefi+gpt方式
  • 探索容器镜像安全管理之道
  • 【MySQL】内置函数
  • 使用arm-none-eabi-gcc编译器搭建STM32的Vscode开发环境
  • 图数据库Neo4j学习二——cypher基本语法
  • ChatGPT:人工智能交互的未来之光
  • 128最长连续数组
  • redis 1