• C/C++之常量


      常量,相信大家并不陌生,它是一种标识符,其值在运行中恒定不变。在C中通常会使用#define来定义常量,通常被称为宏常量。而C++除了#define外,还可以使用const来定义。比如:

    #define MAX 100    // c语言上的宏常量

    const int MIN = 10;   // c++

    1.使用#define的原因

    (1)防止“魔数”的产生,当然可以在程序中使用数字来显示的,但是这会造成他人不理解该数字的含义,使得程序可读性变差。

    (2)避免书写错误,假如说程序的多个地方都会使用到该常量,使用数字的话,若造成错误,难免让人很是郁闷啊

    2.针对于C++中的关于#define或者const的使用,建议使用const,主要从以下方面考虑:

    (1)安全性检查,const常量有数据类型,而宏常量没有数据类型。编译器在会对const常量进行类型检查,而对于#define只是进行替换,所以这样很容易产生意想不到的错误。比如:

    #define NUM = 10 + 2

    int nNum = NUM * 4;    // 会实现你想要的结果吗?

    当然使用#define可以提高执行效率,由于宏变量本身不是函数,故省去了函数压栈,生成汇编语言,返回参数,执行return等过程,从而提高速度。但是边际效应不得不让人重视。

    (2)方便调试,有些集成工具可以对const进行调试,但是对#define不可进行调试。

    3.类常量

    由于#define定义的宏常量是全局的,假如我们希望某些常量只在类中有效的话,#define就不能满足需求了,因此可以使用const修饰数据成员来实现。但是要注意,不可在类的声明中初始化数据成员,由于类的对象未被创建,所以这样是错误的,比如:

    class AA

    {

    const int SIZE = 100;

    int nNum[SIZE];

    };

    vs2012编译器会提示:

    error C2864: “AA::SIZE”: 只有静态常量整型数据成员才可以在类中初始化

    error C2327: “AA::SIZE”: 不是类型名称、静态或枚举数

    error C2065: “SIZE”: 未声明的标识符

    (看着上面的提示可在const int SIZE前加个static试试,^_^)

    所以,正确的方式应该是这样的:

    class AA

    {

      AA(int size);

      const int SIZE;

    };

    AA::AA(int size): SIZE(size)

    {

      ....

    }

    使用该种方式,大家可以想到,因为类可以创建多个对象,所以对于不同的对象其const数据成员的值也是不同的,比如:

    AA a(100);     // SIZE 值为100

    AA b(200);    // SIZE 值为200

    但是,如果想在类中建立一个恒定的常量,该如何呢,有两种方法可做参考:

    (1)在类中使用枚举常量来实现,比如:

    class A

    {

      enum {SIZE1 = 100, SIZE2 = 200};

      int array1[SIZE1];

      int array2[SIZE2];

    };

    枚举常量不会占用对象的存储空间,在编译时会被全部求值。但是其隐含的数据类型是整数,且最大值有限。

    (2)使用static,刚才在上面已给大家提示了哈

    class A

    {

    static const int SIZE = 100;

    int array[SIZE];

    };

    使用static使得该常量与其他静态变量存储在一起,而不是存储在对象中,所以该常量被整个类所共享。

    若有错误,请大家提示,感谢^_^

  • 相关阅读:
    搭建nginx反向代理用做内网域名转发
    TOMCAT下面发布项目的4种方式
    centos 安装 rabbitmq
    RabbitMQ在windows下的安装
    mysql物理备份
    Linux(CentOS)下,下载安装Nginx并配置
    whereis 命令
    windows下安装以及配置nginx
    CentOS 7安装配置Redis数据库
    CentOS6.5下安装ActiveMQ
  • 原文地址:https://www.cnblogs.com/SkyflyBird/p/4572865.html
Copyright © 2020-2023  润新知