• 【Item 02: 尽量以const, enum, inline替换 #define】


    Item 02: 尽量以const, enum, inline替换 #define

    Tip1:使用string 代替char* 效果更好

     const char* const autoName = "scott Meyers";
     // 使用string 代替char* 效果更好
     const std::string authorName = "scott Meyers";
    
    • 1
    • 2
    • 3

    Tip2:针对类的专属常量

    实现方式一

    class GamePlayer
    {
    public:
    	static const int NumTurns = 5;// 静态变量,这里是声明,不是定义
    	int scores[NumTurns];
    
    };
    
    const int GamePlayer::NumTurns;// 此处不能在设置值,否则报错,error C2374: “NumTurns”: 重定义;多次初始化
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    实现方式二

    针对旧的编译器,可以写成下面的样子,可以写成通用的格式

    class CostEstimate {
    private:
    	static const double FudgeFactor;
    public:
    	void print() {
    		cout << FudgeFactor << endl;
    	}
    };
    
    const double CostEstimate::FudgeFactor = 1.35;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    实现方式三

    class GamePlayer
    {
    public:
    	enum{
    		NumTurns = 6
    	};
    	int scores[NumTurns];
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Tip3:使用内联函数,代替宏定义的函数

    #define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
    // 使用下方代替
    	template<typename T>
    	inline void callMax(const T& a, const T& b) {
    		f(a > b ? a : b);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    总结

    1. 对于单纯的常量,尽量使用const和enums代替#define
    2. 对于宏函数,尽量使用内联函数替换掉

    代码测试附录

    #define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
    #include 
    using namespace std;
    
    class GamePlayer
    {
    public:
    	static const int NumTurns = 5;// 静态变量,这里是声明,不是定义
    	int scores[NumTurns];
    
    };
    const int GamePlayer::NumTurns;// 此处不能在设置值,否则报错,error C2374: “NumTurns”: 重定义;多次初始化
    
    class CostEstimate {
    private:
    	static const double FudgeFactor;
    public:
    	template<typename T>
    	inline void callMax(const T& a, const T& b) {
    		f(a > b ? a : b);
    	}
    	void print() {
    		cout << FudgeFactor << endl;
    	}
    };
    const double CostEstimate::FudgeFactor = 1.35;
    
    //class GamePlayer
    //{
    //public:
    //	enum {
    //		NumTurns = 6
    //	};
    //	int scores[NumTurns];
    //};
    
    int main()
    {
    	std::cout << "Hello World!\n";
    	GamePlayer gp;
    	cout << gp.NumTurns << endl;
    	CostEstimate ce;
    	ce.print();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    oracle从入门到精通第二篇(运算符|常用函数|排序|分组)
    数学概念(mathematical concepts)持续更新
    C++‘s most vexing parse
    C++ 派生类函数重载与虚函数继承详解
    拓端tecdat|R语言时间序列分解和异常检测方法应用案例
    【金九银十必问面试题】站在架构师角度分析问题,如何解决TCC中的悬挂问题
    C++初阶作业 String类作业详解
    未能为 SSL/TLS 安全通道建立信任关系
    ubuntu18安装coova chilli精简
    Kafka【命令行操作】
  • 原文地址:https://blog.csdn.net/Android_WPF/article/details/133608705