为什么 public const 不表示静态?

Why does public const not imply static?

在 C# 中,const 表示静态,因此您可以引用 public const,而不必引用 class 或结构的实例。在 C++ 中,情况并非如此。如果你想在 C++ 中访问一个 const 成员变量,你需要首先有一个对 class 的实例的引用。据我所知,在 C++ 中,创建一个成员变量 const 会导致其数据被替换为文字值或存储在程序的文本或数据段(取决于编译器)中。所以我的问题是,如果 const 成员变量只为给定的 class (不是每个实例)分配一次并且存储在与实例特定成员数据分开的区域中,为什么你不能访问 public const class 成员变量而不引用 class 的实例,例如:

struct Example {
   const int array[] = {1, 2, 3};
};

void main() {
   std::cout << Example::array[1];
}

相反,您需要将它们设为静态常量并在 class 之外初始化它们,例如:

struct Example {
   static const int array[3];
};

const int Example::array[3] = {1, 2, 3}

void main() {
   std::cout << Example::array[1];
}

仅仅因为成员是 const 并不意味着它在所有实例中都具有相同的值。考虑:

 struct foo {
     const int x = 1;
     foo(int a) : x(a) {}
 };

 foo a{1};
 foo b{2};

现在 abconst int 成员具有不同的值。我不懂 C#,但当你不能使用 const 非静态时,看起来好像缺少了一些东西 成员。另一方面,const 成员在 C++ 中有一些缺点,最简单的方法是完全避免它们以支持封装(当没有 setter 并且成员永远不会在 class, 基本不变).

请注意,即使成员 = 1; 有一个默认初始化程序,这并不意味着所有实例都具有相同的 x 值。默认初始化器仅在构造函数未在其成员初始化列表中提供初始化器时应用,但在上面的示例中它提供了。