在c+中使用公共枚举来包含默认常量是否是一种常见做法+;? 我是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+中使用公共枚举来包含默认常量是否是一种常见做法+;? 我是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++,enums,C++,Enums,在我看来,这段代码使用公共枚举来保存缓冲区的默认大小。这是C++的常见做法吗?在java中,我会把C++中的一个“私有静态最终int”常量< P> >静态const int /Cube >等效于爪哇中的代码>静态最终INT/COME >。 如果使用c++11,它可以是static constexpr int,以确保常量始终被视为常量 当您有几个相关值时,枚举会更好。因为size()返回一个size\t,为了保持一致性,您可以执行以下操作: size_t default_size() const

在我看来,这段代码使用公共枚举来保存缓冲区的默认大小。这是C++的常见做法吗?在java中,我会把C++中的一个“私有静态最终int”常量

< P> >静态const int /Cube >等效于爪哇中的代码>静态最终INT/COME >。 如果使用c++11,它可以是
static constexpr int
,以确保常量始终被视为常量

当您有几个相关值时,枚举会更好。

因为
size()
返回一个
size\t
,为了保持一致性,您可以执行以下操作:

size_t default_size() const noexcept
{
   return 100;
}

这段代码可能是您希望使用枚举的一个示例,
private static final int
可以直接与
static const int
相关。你描述的案例并不常见,但很有效

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

<>什么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

Meh,这只是一种编码风格/个人偏好。它当然可以是某个地方的
static const int
。或者默认值可以直接作为默认参数。未命名、无范围的枚举的好处是,它们保证不占用空间,并且不需要单独的定义。(如果它是一个
静态常量int
并且你将它传递给一个使用
常量int&
的函数,这算是一个odr使用,你需要一个定义;如果它是一个非范围枚举器,编译器只会为此初始化一个临时的
int
。@T.C.谢谢你的解释!但我不明白为什么未命名、未范围的枚举不占用空间?这应该是一个静态方法。
struct S {
  static const int i = 3;
};
void f(const int &);
void g() { f(S::i); };