在C#中,常量意味着静态,因此您可以引用公共常量,而不必引用类或结构的实例。在C++中,情况并非如此。如果想要访问C++中的常量成员变量,首先需要有一个对类实例的引用。据我所知,在C++中,创建成员变量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];
}
发布于 2020-12-09 19:59:46
仅仅因为成员是const
并不意味着它在所有实例中都具有相同的值。考虑一下:
struct foo {
const int x = 1;
foo(int a) : x(a) {}
};
foo a{1};
foo b{2};
现在,a
和b
的const int
成员具有不同的值。我不知道C#,但当你不能拥有const
非静态成员时,它看起来好像缺少了一些东西。另一方面,在C++中,const
成员也有一些缺点,最简单的方法是完全避免它们,以支持封装(如果没有setter,并且该成员从未在类中修改过,则它本质上是常量)。
请注意,尽管成员= 1;
有一个默认的初始值设定项,但这并不意味着所有实例的x
值都相同。仅当构造函数未在其成员初始化列表中提供初始值设定项时,默认初始值设定项才适用,但在上面的示例中,它提供了初始值设定项。
https://stackoverflow.com/questions/65216184
复制相似问题