首页 > 解决方案 > 错误:非常量静态数据成员必须被初始化

问题描述

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

编译错误

标签: c++classstatic

解决方案


Bjarne Stroustrup在这里解释了这一点:

一个类通常在头文件中声明,并且头文件通常包含在许多翻译单元中。但是,为了避免复杂的链接器规则,C++ 要求每个对象都有唯一的定义。如果 C++ 允许在类内定义需要作为对象存储在内存中的实体,则该规则将被打破。

正如 Stroustrup 所说,每个类都需要一个唯一的定义。现在,我们知道静态成员直接与它们的类相关联。现在考虑两种情况:

  1. static成员也是constant,那么它的初始化是允许内联的,因为编译器可以进行自己的优化并将该成员视为编译时常量,因为它保证它的值永远不会改变。因此,由于该成员的值是固定的,因此与该成员关联的类的定义也是固定的。因此,允许内联初始化。

  2. static成员不是恒定的。然后它的值可以在程序执行期间稍后更改。因此,编译器无法对此成员进行编译时优化。因此,为了防止在加载类时尝试初始化此类成员时可能出现的复杂情况,不允许对此类成员进行内联初始化。

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

看看正交性的概念here


推荐阅读