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

标签 c++ coding-style

style guide对我有用,但我遇到了规则 #5:

In general, the use of such constants should be minimized. In many cases implementing the value as a method is a better choice:

int getMaxIterations() // NOT: MAX_ITERATIONS = 25
{
    return 25;
}

我从风格的角度理解原因:您不仅取消了“大喊大叫”的常量声明,而且还减少了使用的语言结构的数量(原谅我如果这是不正确的术语),使程序更容易理解。

但是,这种方法是否会对编译器产生负面影响,或者现代编译器(或者,事实上,旧编译器..)是否能够足够前瞻以确定您的 getMaxIterations 函数每次都返回相同的数字?

确实,转念一想,编译器是否需要向前看?风格指南建议方法方法比使用常量值更好,我猜这是对的吗,因为“常量”值在任何范围内使用后都不需要保存在内存中它在已经完成了吗?

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

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

最佳答案

大多数编译器都是内联的。

话虽如此,风格指南是有道理的。它说而不是这样做:

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

应该是这样的:

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

如您所见,从长远来看,它的一致性和可读性要好得多,并且有利于以后的设计,例如当您从类继承时。稍后,您可能希望在运行时修改 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(); }
};

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

关于c++ - 不鼓励在 C++ 中使用常量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12609971/

相关文章:

c++ - 将静态 C 库与 C++ 代码链接时出现 "undefined reference to"错误

c# - DataGridViewCell 边框颜色

java - 对象中的自引用是不良代码设计的证据

python - 如何检查一个数字是否在一个区间内

c++ - 我可以在不定义构造函数的情况下在堆上创建一个新结构吗?

java - 使用 getter 还是直接访问私有(private)成员更好?

c++ - 为什么 -1 >> 1 是 -1 ?并且 1 >> 1 是 0!

c++ - 如果有更多重复键,则快速排序算法改进

c++ - 如何使用单应性围绕图像中心旋转图像?

c++ - timeval 到字符串(在两者之间转换)