我是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"恒定
答案 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
相关联。你描述的案例并不常见,但有效。