gpt4 book ai didi

c++ - 错误 : non-const static data member must be initialized out of line

转载 作者:行者123 更新时间:2023-12-01 14:42:57 24 4
gpt4 key购买 nike

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给出错误?

compilation error

最佳答案

Bjarne Stroustrup 解释了这一点 here :

A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects.



正如 Stroustrup 所说,每个类都需要一个唯一的定义。现在,我们知道静态成员直接与其类相关联。现在考虑两种情况:
  • static成员(member)也是constant ,然后它的初始化被允许内联,因为编译器可以进行自己的优化并将这个成员视为编译时常量,因为它保证它的值永远不会改变。因此,由于该成员的值是固定的,因此该成员所关联的类的定义也是固定的。因此,允许内联初始化。
  • static成员不是常数。然后它的值可以在程序执行期间更改。因此,编译器无法对这个成员进行编译时优化。因此,为了防止在加载类时尝试初始化此类成员时可能出现的复杂情况,不允许对此类成员进行内联初始化。

  • PS:当我第一次听到这个概念时,我也很困惑,因为它不符合程序员所希望的正交性原则。正交性原理会说明,既然我们可以结合 intstatic ;和 intconst ,我们应该可以写 static const intstatic int以类似的方式。但这里的这种情况是一种情况的示例,语言的开发人员必须放弃语言用户的正交性,以换取编译过程的简单性。

    看看正交性的概念 here

    关于c++ - 错误 : non-const static data member must be initialized out of line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61518284/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com