类的成员函数的静态局部变量问题

隔壁寝室同学说老师课下留了一道题,发现输出有点奇怪,大家仔细探讨后发现问题,查询相关资料后,补充了一个知识点:类的成员函数的静态局部变量只在第一次调用时初始化
源码如下:
主要关注的是类的静态局部变量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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值