隔壁寝室同学说老师课下留了一道题,发现输出有点奇怪,大家仔细探讨后发现问题,查询相关资料后,补充了一个知识点:类的成员函数的静态局部变量只在第一次调用时初始化
源码如下:
主要关注的是类的静态局部变量i和类的成员函数的静态局部变量value
#include <iostream>
using namespace std;
class Test {
public:
static int i;
Test(int t = 1) { i = t; cout<<"calling A\n";} //为了方便查看调用情况加上了calling A/B
Test(Test &t) { ++t.i; cout<<"calling B\n";}
void g(Test a) {
cout << "o.i1==" << i << " ";
static int value = ++a.i;//这句话只在第一次调用g()的时候有效
cout << "o.i2==" << i << " ";
value += a.i;
cout<<value<<"\n";
}
};
int Test::i = 0;
int main() {
Test o;//i = 1
Test p;// i =1
cout << "o.i==" << o.i << " ";//输出o.i == 1
o.g(o);//调用带引用参数的构造函数,i =2 o.i1==2 value = 3 o.i2==3 value = 6
cout << "o.i==" << o.i << " ";//输出o.i == 3
o.g(o);//还是调用第二个构造函数,i=4 o.i1==4value此时不再初始化,o.i2==4 value=10
cout << "o.i==" << o.i << " ";//输出o.i==4
o.g(o);//第二个构造函数,i=5 o.i1==5value不初始化 o.i2==5value =15
// cout << "o.i==" << o.i << " ";
cout<<endl;
return 0;
}
输出:
calling A
calling A
o.i==1 calling B
o.i1==2 o.i2==3 6
o.i==3 calling B
o.i1==4 o.i2==4 10
o.i==4 calling B
o.i1==5 o.i2==5 15