为什么public const不意味着static



在C#中,const意味着静态,因此您可以引用公共const,而不必引用类或结构的实例。在C++中,情况并非如此。如果要访问C++中的const成员变量,则需要首先引用该类的实例。据我所知,在C++中,使成员变量const会导致其数据被替换为文字值,或存储在程序的文本或数据段中(取决于编译器(。所以我的问题是,如果const成员变量只为给定的类分配一次(而不是每个实例(,并存储在与实例特定的成员数据分离的区域中,为什么你不能在不引用类实例的情况下访问公共const类成员变量,例如:

struct Example {
const int array[] = {1, 2, 3};
};
void main() {
std::cout << Example::array[1];
}

相反,您需要使它们成为一个静态常量,并在类之外初始化它们,例如:

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};

现在ab对于它们的const int成员具有不同的值。我不知道C#,但当你不能使用const非静态时,它看起来好像缺少了一些东西成员。另一方面,const成员在C++中也有一些缺点,最简单的方法是完全避免它们,而支持封装(当没有setter并且该成员在类中从未被修改时,它本质上是恒定的(。

请注意,即使有成员= 1;的默认初始值设定项,这并不意味着所有实例都具有相同的x值。默认初始值设定项仅适用于构造函数在其成员初始化列表中没有提供初始值设定值的情况,但在上面的示例中它提供了

最新更新