首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么public const不暗示静态?

为什么public const不暗示静态?
EN

Stack Overflow用户
提问于 2020-12-09 19:48:24
回答 1查看 141关注 0票数 0

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

代码语言:javascript
运行
复制
struct Example {
   const int array[] = {1, 2, 3};
};

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

相反,您需要将它们设置为静态常量,并在类外部对其进行初始化,例如:

代码语言:javascript
运行
复制
struct Example {
   static const int array[3];
};

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

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-09 19:59:46

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

代码语言:javascript
运行
复制
 struct foo {
     const int x = 1;
     foo(int a) : x(a) {}
 };

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

现在,abconst int成员具有不同的值。我不知道C#,但当你不能拥有const非静态成员时,它看起来好像缺少了一些东西。另一方面,在C++中,const成员也有一些缺点,最简单的方法是完全避免它们,以支持封装(如果没有setter,并且该成员从未在类中修改过,则它本质上是常量)。

请注意,尽管成员= 1;有一个默认的初始值设定项,但这并不意味着所有实例的x值都相同。仅当构造函数未在其成员初始化列表中提供初始值设定项时,默认初始值设定项才适用,但在上面的示例中,它提供了初始值设定项。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65216184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档