C++中静态变量的初始化顺序:为什么在这段代码中'j'的输出等于3?

yshpjwxd  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(152)

我有下面的C代码,初始化类R的静态变量notreR和整型变量j,后者也是类R的成员。然而,当我在初始化notreR之后将j初始化为0时,在代码末尾j的值仍然为3。我想知道为什么j和notreR的初始化顺序无关紧要。
编辑:我在理解动态初始化和静态初始化之间的区别时遇到了问题,IgorTandetnik在评论中给出了答案
你似乎期望R* R::notreR = new R(0);首先,递增j(从哪个值开始?如果你认为j还没有初始化,那么你认为j
应该产生什么?),然后int R::j = 0;我将运行并将j重置为零。这不是它的工作方式。请参见本文,特别是静态初始化和动态初始化之间的区别
下面是输出:

r2 = R, i = 2
monR = NULL
r1 = R, i = 1
monR = R, i = 2
R:: notreR = R, i = 0
monR = R, i = 1
R::j = 3

下面是代码:

#include <iostream>



using namespace std;


class R{
    public:
    static R* notreR;
    static int j;
    int i;
    R* monR;
    R(int a){
        i = a;
        monR=NULL;

        j++;
    }
    static void p(R* r){
        j=0;
        notreR = new R(0);
        m(notreR);
    }
    static void q(R* r){
        cout << "R:: notreR = ";
        m(notreR);
        cout << "monR = ";
        if(notreR->monR!=NULL) 
        notreR->monR->m(notreR->monR);
        else cout << "NULL" << endl;
        cout << "R::j = " << j << endl;
    }

    static void m(R* r){
        cout << "R, i = " << r->i << endl;
    }

    static void n(R* r){
        m(r);
        cout << "monR = ";
        if(r->monR!=NULL) 
        r->monR->m(r->monR);
        else cout << "NULL" << endl;
    }

    };

    R* R::notreR = new R(0);
    
    int R::j = 0;

    

    class S{
        public:
        static void main(){
            R* r1 = new R(1);
            R::notreR->monR = r1;
            R* r2 = new R(2);
            cout << "r2 = ";
            
            R::n(r2);
            r1->monR = r2; 
            cout << "r1 = ";
            R::n(r1); 
            R::q(r1); 
        }
    };
int main(){
    
    S::main();
    return 0;
}
xuo3flqw

xuo3flqw1#

为什么在这段代码中'j'的输出等于3?
这是因为在打印j之前,您已经使用了R(int)构造函数3次。
首先,将staticR*

R* R::notreR = new R(0); // j == 1

然后在S::main中重复两次:

R* r1 = new R(1);        // j == 2
R::notreR->monR = r1;
R* r2 = new R(2);        // j == 3

相关问题