在类中定义常量(用于常量表达式)的最佳方法?

aJ.*_*aJ. 6 c++ constants

我正在尝试为给定的用例为我的类定义一个常量BUFFER_LENGTH.

//1. Using preprocessor declaration
//#define BUFFER_LENGTH  12

//2.Global constant
//const int BUFFER_LENGTH  = 12;
class MyRequest
{
public:
    //3. Define an in-class constant
    //static const int BUFFER_LENGTH = 12;

    //4. Declare an enum constant
    enum 
    {
        BUFFER_LENGTH = 12
    };

    MyRequest()
    {
        strcpy(mBuffer, "TestString");
        printf("Buffer: %s, BUFFER_LENGTH = %d",mBuffer, BUFFER_LENGTH);
    }
private:
    char mBuffer[BUFFER_LENGTH];
};
Run Code Online (Sandbox Code Playgroud)

我刚刚列出了可以为类定义常量的不同方法.

1. Using Preprocessor constant
2. Using Global constant
3. Using in-class constant
4. using an enum.
Run Code Online (Sandbox Code Playgroud)

其中,哪个是定义给定用例的常量的最佳方法?我更喜欢使用枚举常量而非其他方法.有没有其他更好的方法,我错过了.

谢谢,

xto*_*ofl 10

枚举类型并不意味着定义数字常量,尽管它(ab)在模板元编程中使用了很多.

如果常量的含义与类纠缠在一起,我会在那里定义它.那你还有两个选择:

 class WithConst {
 public:

     // 1. as a const static member variable
     static const int sc_nNumber = 100; // I can initialize here for
                                        // integral-types only

     // 2. as a static member function - possibly inlined.
     static int sf_nNumber() { return 100; }
 };
Run Code Online (Sandbox Code Playgroud)

第二种选择的优点是,当您想要例如从注册表或配置文件中读取常量时,您不需要稍后更改任何客户端代码.


j_r*_*ker 9

为了维护目的,最好尽可能地限制任何名称的范围(无论是函数,变量还是常量).所以我建议

static const int BUFFER_LENGTH = 12;
Run Code Online (Sandbox Code Playgroud)

要么

enum { BUFFER_LENGTH = 12 };
Run Code Online (Sandbox Code Playgroud)

类定义中.

前者没有太大的好处,除了你可以明确控制类型. enum导致C++为你选择一个未指定的整数"底层类型" - 它可能就像char你的枚举只包含很小的值一样小,但根据经验,大多数编译器默认使用一个int.