关于成员函数内的static变量和成员private变量的一些区别

static变量仅在代码第一次运行到对象定义语句时执行初始化。且直到程序终止之时才被销毁。即使它是一个类中的成员函数内的局部变量。
Leetcode 114 二叉树展开为链表
做这道题时突发奇想,写出了这样的代码。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void flatten(TreeNode* root) {
        static TreeNode *prev = nullptr;
        if(root == nullptr) return;
        TreeNode *realL = root->left, *realR = root->right;

        if(prev != nullptr) {
            prev->left = nullptr;
            prev->right = root;
        }
        prev = root;

        flatten(realL);
        flatten(realR);
    }
};

本意是让prev作为static成员保存之前调用的值,但是却遇到奇怪的bug:单独测试用例可以通过,提交过不去

最后发现,把代码改成如下即可通过:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void flatten(TreeNode* root) {
        
        if(root == nullptr) return;
        TreeNode *realL = root->left, *realR = root->right;

        if(prev != nullptr) {
            prev->left = nullptr;
            prev->right = root;
        }
        prev = root;

        flatten(realL);
        flatten(realR);
    }
private:
    TreeNode *prev = nullptr;
};

这引发了我对static成员变量的研究,实验发现的结论是文章开头那句。(C++ Primer page185)
测试代码:

#include <iostream>

using namespace std;

class Testcase {
public:
    Testcase(int _y = 0) : y(_y) {}
    void staticTest() {
        static int x = 0;
        cout << x << endl;
        x++;
    }
    void memTest() {
        cout << y << endl;
        y++;
    }
private:
    int y;
};

int main(int argc, char *argv[])
{
    Testcase t1, t2;
    t1.staticTest();
    t2.staticTest();
    t1.staticTest();
    t2.staticTest();
    t1.memTest();
    t2.memTest();
    t1.memTest();
    t2.memTest();

    return 0;
}

输出结果:

0
1
2
3
0
0
1
1

结论:static变量由所有类对象所共有。不论是在成员函数内的局部变量还是static成员变量。

posted @   柚子z  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示