C++ 函数中的静态常量数据成员与硬编码值

C++ 函数中的静态常量数据成员与硬编码值,c++,C++,我有一个带有数据属性的类,比如说类型int,它在整个程序运行期间应该是常量,并且在所有类实例中都具有相同的值。我希望此值可以通过名为get\u value()的公共成员函数访问。显而易见的方法是定义一个privatestatic const类成员并让get\u value返回它 或者,我可以将该值放在get_value本身的定义中:例如,int get_value()const{return 5;}。第一种方法明显优于第二种方法吗 我认为这只是风格问题,因为在大多数情况下,编译会优化常量 我认为

我有一个带有数据属性的类,比如说类型
int
,它在整个程序运行期间应该是常量,并且在所有类实例中都具有相同的值。我希望此值可以通过名为
get\u value()
的公共成员函数访问。显而易见的方法是定义一个private
static const
类成员并让
get\u value
返回它


或者,我可以将该值放在
get_value
本身的定义中:例如,
int get_value()const{return 5;}
。第一种方法明显优于第二种方法吗

我认为这只是风格问题,因为在大多数情况下,编译会优化常量

我认为这只是风格问题,因为在大多数情况下,编译会优化常量

为什么不将静态常量声明为public,如下所示

#include <iostream>
using namespace std;

class Foo {
public:
  static const int VALUE = 5;
};

int main() {
  cout << Foo::VALUE << endl;
  return 0;
}
#包括
使用名称空间std;
福班{
公众:
静态常数int值=5;
};
int main(){

你为什么不把静态常数声明为public,如下所示

#include <iostream>
using namespace std;

class Foo {
public:
  static const int VALUE = 5;
};

int main() {
  cout << Foo::VALUE << endl;
  return 0;
}
#包括
使用名称空间std;
福班{
公众:
静态常数int值=5;
};
int main(){

从计算的角度来看,编译后的代码应该没有太大的差异

但是使用第一种方法,您并没有在函数中隐藏变量:如果您没有1个变量,而是10个变量,我希望在类的开头看到它们的定义,而不是在下面的一些getter函数10行中


我认为它更干净,我知道什么是“神奇的价值观”,看你的课,我不需要通过你的函数。

< P>从计算的角度来看,在编译代码方面不应该有太大的差异。 但是使用第一种方法,您并没有在函数中隐藏变量:如果您没有1个变量,而是10个变量,我希望在类的开头看到它们的定义,而不是在下面的一些getter函数10行中


我认为它更干净,我知道什么是“神奇的价值观”,我看你的课,我不需要通过你的函数。

< P>想想一个维护程序员,看看你的代码一年后,思考:为什么五?五是什么意思?也许是六,当我们在星期六工作?< / P> 如果他看到以下内容,则比较他的任务:

   int const MY_BEST_GUESS_AT_LOW_WATERMARK = 5;
   return MY_BEST_GUESS_AT_LOW_WATERMARK;

想想一个维护程序员,他一年后看着你的代码,想:为什么是五个?五是什么意思?当我们在周六工作时,可能真的是六个

如果他看到以下内容,则比较他的任务:

   int const MY_BEST_GUESS_AT_LOW_WATERMARK = 5;
   return MY_BEST_GUESS_AT_LOW_WATERMARK;


公共静态常量也可能是一个考虑因素。例如
std::numeric\u limits::digits
。您在回答中提到get\u value需要是虚拟的,但在问题陈述中,您说get\u value需要让所有类实例返回相同的内容。使函数虚拟的全部原因是让它执行不同的操作租金取决于类实例。我认为您可能需要重新考虑使用它的目的。一个好奇的问题是,静态in函数(可能是内联的,因此可以使用头文件)模式是否可以避免(额外的文件,因此需要额外的编译和链接器时间)定义静态成员的storagePublic静态常量的实现文件也可能是一个考虑因素。例如
std::numeric\u limits::digits
。您在回答中提到get\u值需要是虚拟的,但在问题陈述中,您说get\u值需要让所有类实例返回相同的内容。原因是将函数虚拟化是使它根据类实例做一些不同的事情。我认为您可能需要重新考虑使用它的目的。一个好奇的问题是,静态in函数(可能是内联的,因此可以使用头)模式是否可以避免需要(额外的文件,因此需要额外的编译和链接器时间)定义静态成员存储的实现文件为了便于说明,我简化了函数名——实际上它有一个更具描述性的名称。比较实际上是函数和静态变量之间的比较(两者都有描述性名称),或者仅仅是函数My point所代表的,追求可读性。编译器将生成相同的代码,因为您的值在编译时是已知的。如果您认为您的常量值是类接口的一部分(即,您的类对世界说“此参数默认为5”)如果把它们看作是实现的细节,如果不注意就改变了,就把它们隐藏在实现文件中。我简化了函数名称的说明——它是现实的,它有一个更具描述性的名称。比较实际上是在函数和静态变量之间(既有描述性名称)。,或者仅仅是函数My point所代表的,追求可读性。编译器将生成相同的代码,因为您的值在编译时是已知的。如果您认为您的常量值是类接口的一部分(即,您的类对世界说“此参数默认为5”)如果你考虑了它们的实现细节,如果你不注意就改变了,把它们隐藏在实现文件中。<代码>公共< /COD>数据成员减少封装。尽可能避免它们。@ STW:好的理由。+ 1。实际上,这是一个重要的事情添加到问题陈述中。如果这个方法必须是虚拟的这会阻止一些更明显的编译器优化成为可能(内联等)那么,这会使一种方法优于另一种方法吗?再想一想,可能不会-尽管比我聪明的人可能会进一步评论。我怀疑编译器会将整数常量内联到
get\u value
方法的主体中。但是,
get\u value
的调用本身不能内联在某些情况下,由于它是虚拟的。
public
data