zoukankan      html  css  js  c++  java
  • Effective C++ 学习笔记(2)

    尽量使用const和inline而不是#define

      尽量使用编译器而不是预处理。

      #define定义的宏不会加入符号表,不利于调试。

      当使用#define定义常量时,使用const替代:#define ABC 123 => const int ABC=123;定义某个class常量时要同时用static与const修饰,以确保只存在一份拷贝。

       当使用#define定义类似函数的宏时,用inline函数替代:

       举例:

         计算两个对象大小:#define max(a,b) ((a)>(b)?(a):(b)),对于这样的宏一定要加括号,因为预处理器只是完成简单的字符串替代,可能引起意想不到的问题。

         对于下面情况:

                int a=5, b=0;

                max(++a,b); //a的值增加了两次,因为++a>b,所以问号前后各一次,a=7,b=0

                max(++a,b+10);//a的值增加了一次,因为++a<b+10,返回b+10,a=6,b=0

          对于这种情况,使用inline函数替代:

                inline int max(int a,int b)

                {

                  return a>b?a:b;

                }

          上述函数的缺点时只能处理int类型,改为模板如下:

                template<class T>

                inline const T& max(const T& a, const T& b)

                {

                  return a>b?a:b;

                }

          这里使用引用传递,在T表示较大的类型时可以提高效率。 

  • 相关阅读:
    C#3.0之神奇的Lambda表达式和Lambda语句
    Expression Tree 学习笔记(一)
    C#对象序列化与反序列化
    Linux Shell编程入门
    ora-03113或者ora-12573 通信通道的文件结束出现异常错误:核心转储
    如何实现文档在线预览
    使用npoi导入Excel
    判断时间(时:分)是否在某个时间段内
    程序员开发时遇到的那些缩写和名词(记录)
    git
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2011280.html
Copyright © 2011-2022 走看看