我有下面的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;
}
1条答案
按热度按时间xuo3flqw1#
为什么在这段代码中'j'的输出等于3?
这是因为在打印
j
之前,您已经使用了R(int)
构造函数3次。首先,将
static
R*
:然后在
S::main
中重复两次: