c++ - 错误:非常量静态数据成员必须被初始化
问题描述
class Solution {
public:
static int m=INT_MIN; // it shows error: non-const static data member must
be initialized out of line.(why?)
using "int m=INT_MIN" is fine.
int func(TreeNode*root){
if(root==NULL){
return 0;
}
int l=max(func(root->left),0);
int r=max(func(root->right),0);
m=max(l+r+root->val,m);
return max(l,r)+root->val;
}
int maxPathSum(TreeNode* root) {
if(root==NULL)
{
return 0;
}
m=INT_MIN;
int x=func(root);
return m;
}
};
我需要更新变量的值m
。因此我使用static int
数据类型。但是下面的错误来了。使用int
而不是static int
工作正常。但是为什么static int
给出错误?
解决方案
Bjarne Stroustrup在这里解释了这一点:
一个类通常在头文件中声明,并且头文件通常包含在许多翻译单元中。但是,为了避免复杂的链接器规则,C++ 要求每个对象都有唯一的定义。如果 C++ 允许在类内定义需要作为对象存储在内存中的实体,则该规则将被打破。
正如 Stroustrup 所说,每个类都需要一个唯一的定义。现在,我们知道静态成员直接与它们的类相关联。现在考虑两种情况:
该
static
成员也是constant
,那么它的初始化是允许内联的,因为编译器可以进行自己的优化并将该成员视为编译时常量,因为它保证它的值永远不会改变。因此,由于该成员的值是固定的,因此与该成员关联的类的定义也是固定的。因此,允许内联初始化。static
成员不是恒定的。然后它的值可以在程序执行期间稍后更改。因此,编译器无法对此成员进行编译时优化。因此,为了防止在加载类时尝试初始化此类成员时可能出现的复杂情况,不允许对此类成员进行内联初始化。
PS:当我第一次听到这个概念时,我也很困惑,因为它不符合程序员所期望的正交性原则。正交性原理将说明,因为我们可以组合int
和static
; 和int
,const
我们应该能够以类似的方式编写static const int
和。static int
但是这里的这种情况是一种情况的例子,一种语言的开发人员必须放弃对语言用户的正交性,以换取编译过程的简单性。
看看正交性的概念here
推荐阅读
- javascript - Next Js中如何从URL中去除重复的斜杠。如何拦截和修改服务器端getServerSideProps上的请求?
- kubernetes - 升级之间的 Helm3 Kubernetes 环境变量
- windows - 无法在 Windows 10 上的 STS4 中打开市场
- java - 无法从执行的 Java 中获取错误级别
- visual-studio-code - 切换到最后一个选项卡的 VScode 快捷方式
- php - 交换两条记录不起作用:我收到“调用成员函数 save() on null”错误
- java - 有时发出请求 db 结果集的问题,我确实向 sql 发出请求,但我没有在日志中收到任何错误,只有加载程序可见
- powershell - 替换讨厌的“变音符号” | 标准方式不起作用
- go - 如何使用 go channel 同时处理 2 个进程
- http - 请求超时的 http 重试 (408)