【发布时间】:2020-12-09 11:48:24
【问题描述】:
在 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 成员变量只为给定的类分配一次" 是什么让你认为它是这样工作的?
-
类的非静态
const数据成员在该类的不同实例中可以具有不同的值。const只是表示一旦初始化就不能修改。 -
@G.M.感谢您的澄清,我不知道 const 变量可能会因this stack overflow question 导致我相信而因实例而异。我认为这也意味着在这些情况下,它们实际上与每个实例数据的其余部分一起存储在堆栈或堆中,而不是存储在数据或文本部分中。
-
在 C# 中,
const类成员可能只有一个(即每个类)实例。 C++ 的每个类实例都有一个const成员实例(并且该成员可以在初始化包含对象时由构造函数初始化)。一个类的成员通常不是static,除非特别声明为static。更普遍的问题是“这样做,为什么 C++ 这样做不同?”有一个普遍的答案“因为 C++ 和 是不同的语言,旨在满足不同的目的”。 -
@Ryoku 请注意,您链接的问题是关于 C,而不是 C++。 C 根本没有类,因此从 C 如何做任何事情中得出关于 C++ 如何存储有关类成员变量的信息的结论是危险的。