不鼓励在C++中使用常量吗?

oli*_*are 9 c++ coding-style

这个风格指南对我很有用,但我遇到了规则#5:

通常,应尽量减少这些常数的使用.在许多情况下,将值作为方法实现是一个更好的选择:

int getMaxIterations() // NOT: MAX_ITERATIONS = 25
{
    return 25;
}
Run Code Online (Sandbox Code Playgroud)

我从风格的角度理解推理:你不仅要废除"喊叫"常量声明,而且还要减少正在使用的语言结构的数量(如果这是不正确的术语,请原谅我),程序更容易理解.

但是,这种方法对编译器有贬义作用,还是现代编译器(或者实际上是较旧的编译器......)能够足够前瞻以确定每次getMaxIterations函数返回相同的数字?

事实上,在第二个想法,编译器甚至需要展望未来?样式指南建议方法方法比使用常量值更好,我是否正确地猜测这是因为"常量"值在其在任何已完成的范围内使用后不需要保存在内存中?

总之,我的问题是:不鼓励使用常数值,如果是,为什么?

(对于奖励积分,将常量值声明为方法和常量之间的技术差异是什么?)

std*_*ave 4

大多数编译器都内联了这一点。

话虽如此,风格指南已经说明了一点。它说而不是这样做:

#define FOO_MAX_ITERATIONS 25
struct Foo {
  void do_it() { for(int i = 0; i < FOO_MAX_ITERATIONS; i++) iterate(); }
};
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

struct Foo {
  int getMaxIterations() { return 25; }
  void do_it() { for(int i = 0; i < getMaxIterations(); i++) iterate(); }
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,从长远来看,它更加一致和可读,并且有利于以后的设计,例如当您从类继承时。稍后,您可能希望在运行时修改 getMaxIterations(),并且您不必执行类似 #define FOO_MAX_ITERATIONS someMethod() 之类的丑陋 hack。

如果您使用任何正常的 C++11 编译器(即不是 Visual Studio),此类函数还应声明如下:

struct Foo {
  constexpr int getMaxIterations() { return 25; }
  void do_it() { for(int i = 0; i < getMaxIterations(); i++) iterate(); }
};
Run Code Online (Sandbox Code Playgroud)

注意 getMaxIterations() 声明中的 constexpr 。这告诉 C++11 编译器它是一个“常量表达式”,并且可以在编译时对其进行求值。通过这样做,它可以在编译之前直接将 getMaxIteratsion() 替换为 25,还有很多很多其他功能,例如允许您在其他编译时声明中使用它。