在c ++中使用公共枚举来包含默认常量是一种常见的做法吗?

时间:2014-12-29 20:05:50

标签: c++ enums

我是c ++的初学者,有一些Java背景。我穿过这段示例代码

class simple_cbuf { 
public:
    enum { default_size = 100; };
    explicit simple_cbuf(size_t size =
                         default_size);
    ~simple_cbuf();
    size_t size() const;
    bool   empty() const;
    int    top() const; /* see below */
    void   pop();
    void   push(int new_value);
  private:
    /* whatever you want */
};

在我看来,此代码使用公共枚举来保存缓冲区的默认大小。这是c ++中的常见做法吗?在Java中,我会将其作为一个" private static final int"恒定

4 个答案:

答案 0 :(得分:1)

这是一种相当普遍的做法,确保常量在所有情况下都被视为常量。

C ++有很多东西,Java没有,是对任何类型的引用,甚至是原始类型,并且因此,

struct S {
  static const int i = 3;
};
void f(const int &);
void g() { f(S::i); };

的行为与行为者的行为不同:它不会占用S::i的值,将其存储在临时对象中,并将该对象传递给f。相反,直接将引用直接传递给S::i f

这听起来不错,但是如果您没有意识到自己确实需要S::i的定义,可能会导致令人惊讶的问题,以确保其地址能够得到解决。

enum避免:在enum { i = 3 };之后,i是一个左值,并且无法获取其地址。 f(i);有效,并会将临时对象传递给f

答案 1 :(得分:0)

在c ++中static const int相当于java中的static final int。 如果使用c ++ 11,可以static constexpr int确保常量被视为常量。

当你有一些相关的值时,枚举会更好。

答案 2 :(得分:0)

由于size()返回size_t,为了保持一致性,您可以执行以下操作:

size_t default_size() const noexcept
{
   return 100;
}

答案 3 :(得分:0)

class simple_cbuf { 
public:
    enum { 
           default_size = 100, 
           expanded_size = 150,
           abridged_size = 50
    };
    explicit simple_cbuf(size_t size =
                     default_size);
    ~simple_cbuf();
    size_t size() const;
    bool   empty() const;
    int    top() const; /* see below */
    void   pop();
    void   push(int new_value);
private:
    /* whatever you want */
};

此代码可能是您要使用枚举的原因示例,private static final int可以直接与static const int相关联。你描述的案例并不常见,但有效。