关于成员函数内的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成员变量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!