【问题标题】:Is it a common practice to use public enum for containing default constants in c++? [duplicate]使用公共枚举来包含 C++ 中的默认常量是一种常见的做法吗? [复制]
【发布时间】:2014-12-29 20:05:50
【问题描述】:

我是 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 中,我会将其设为“私有静态最终 int”常量

【问题讨论】:

  • 嗯,这只是编码风格/个人喜好。它当然可以是某个地方的static const int
  • 或者直接将默认值作为默认参数。
  • 未命名的、无范围的枚举的好处是它们保证不占用空间,并且永远不需要单独的定义。 (如果它是 static const int 并且您将它传递给采用 const int & 的函数,这算作 odr-use 并且您需要一个定义;如果它是一个无作用域的枚举器,编译器将只初始化一个临时的 int 用于那个。)
  • @T.C.感谢您的解释!但我不明白为什么未命名、未限定范围的枚举不占用空间?

标签: c++ enums


【解决方案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

【讨论】:

    【解决方案2】:

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

    size_t default_size() const noexcept
    {
       return 100;
    }
    

    【讨论】:

    • 这应该是一个静态方法。
    【解决方案3】:
    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 相关。您描述的情况不常见,但有效。

    【讨论】:

      【解决方案4】:

      在 c++ 中,static const int 等同于 java 中的 static final int。 如果您使用 c++11,则可以使用static constexpr int 以确保始终将常量视为常量。

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

      【讨论】:

        猜你喜欢
        • 2010-10-16
        • 2015-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 2019-11-01
        相关资源
        最近更新 更多