zoukankan      html  css  js  c++  java
  • C++学习之路(七):以const,enum,inline替换#define

    这篇博文主要是编程中的一些问题和技巧。如题目所示,这些关键字的作用不再进行描述。直接描述功能和实例代码。

    首先,在头文件中对类进行定义,是不会为类分配内存空间的,在这一点上类定义可以和普通变量类型的声明匹配,这里需要理解的概念就是“声明”和“定义”,在此不再赘述。

    既然类定义不会被分配内存,那显然,如下定义是错误的:

    class A
    {
    private:
        int a = 5;
    };

    类成员变量a想要直接定义并初始化,如果成功,显然a会被分配实际内存空间,这与类定义不符,所以上述代码编译不会通过。

    接下来考虑一个场景,类成员变量中有一个数组需要被初始化,数组长度根据另一个类成员变量初始化,如何办到?

    class A
    {
    private:
        int len = 5;   //错误
        int array[len];
    };

    这里可以有多种方式,分别描述:

    一、使用#define宏定义

    class A
    {
    private:
        #define len 5
        int array[len];
    };

    上述代码可以完成所需功能,但由于宏定义不具有作用域的概念,在A类中定义的宏len,在A类外部甚至在其他类中都可以使用。

    显然,上述的方式破坏了类的封装性,尽管能够实现所需功能,但也不提倡这样做。

    二、使用const替换#define

    class A
    {
    private:
        static const int len = 5;
        int array[len];
    };

    定义static const变量,在编译期间完成变量的初始化工作,则可以实现所需需求,同时不破坏封装性。

    三、使用enum替换#define

    class A
    {
    private:
        enum {len = 5};
        int array[len];
    };

    使用枚举类型定义依然可以达到上述效果,并同样保证了类的封装。

    结论:对于单纯常量,最好以const对象或enum替换#define

    四、使用inline替换#define

    这个主要是涉及内联函数展开的过程。对于形式函数的宏,尽量使用inline函数替换#define

  • 相关阅读:
    改善用户体验之alert提示效果
    用javascript制作放大镜放大图片
    window.history.go(1)返回上页的同时刷新"上页"技术
    JS折叠菜单
    懒得勤快的博客 resharper 等好文
    IBM DOMINO LOTUS LIMITS
    为CKEditor开发FLV视频播放插件
    Calling DLL routines from LotusScript. Part I: Windows API
    lotus domino下使用FCKeditor
    domino文件拆离数据库,放入指定目录
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/8778707.html
Copyright © 2011-2022 走看看