文章目录
mutable的用法
1 目标
本文的目的是了解静态变量和静态函数的用法。
可以把静态理解为全局
2 示例代码
- 静态成员函数: 不能访问非静态成员变量和非静态成员函数。
- 非静态成员函数: 可以访问静态成员变量,并且可以调用静态成员函数。
#include <iostream>
class MyClass {
private:
static int staticVar; // 静态成员变量
int nonStaticVar; // 非静态成员变量
public:
MyClass(int val) : nonStaticVar(val) {}
// 静态成员函数
static void setStaticVar(int value) {
staticVar = value;
// 静态成员函数不能访问非静态成员变量和非静态成员函数
// nonStaticVar = value; // 错误,不能访问非静态成员变量
// setNonStaticVar(value); // 错误,不能调用非静态成员函数
}
// 静态成员函数
static int getStaticVar() {
return staticVar;
}
// 非静态成员函数
void setNonStaticVar(int value) {
nonStaticVar = value;
}
// 非静态成员函数
int getNonStaticVar() const {
return nonStaticVar;
}
// 非静态成员函数
void printValues() const {
std::cout << "非静态变量的值: " << nonStaticVar << std::endl;
std::cout << "静态变量的值: " << staticVar << std::endl;
// 非静态成员函数可以访问静态成员变量和调用静态成员函数
std::cout << "通过静态成员函数获取的静态变量的值: " << getStaticVar() << std::endl;
}
// 非静态成员函数调用静态成员函数
void callStaticFunction() const {
std::cout << "在非静态成员函数中调用静态成员函数设置静态变量。" << std::endl;
setStaticVar(300); // 可以调用静态成员函数
}
};
// 静态成员变量定义和初始化
int MyClass::staticVar = 0;
int main() {
MyClass obj1(10);
MyClass obj2(20);
// 使用类名调用静态成员函数
MyClass::setStaticVar(100);
std::cout << "静态变量的值: " << MyClass::getStaticVar() << std::endl; // 输出: 静态变量的值: 100
// 使用对象调用非静态成员函数
obj1.setNonStaticVar(30);
std::cout << "obj1 的非静态变量的值: " << obj1.getNonStaticVar() << std::endl; // 输出: obj1 的非静态变量的值: 30
obj2.setNonStaticVar(40);
std::cout << "obj2 的非静态变量的值: " << obj2.getNonStaticVar() << std::endl; // 输出: obj2 的非静态变量的值: 40
// 静态变量在类的所有实例中共享
MyClass::setStaticVar(200);
std::cout << "静态变量的值: " << MyClass::getStaticVar() << std::endl; // 输出: 静态变量的值: 200
// 非静态成员函数可以访问静态成员变量和调用静态成员函数
obj1.printValues(); // 输出: 非静态变量的值: 30, 静态变量的值: 200, 通过静态成员函数获取的静态变量的值: 200
// 在非静态成员函数中调用静态成员函数
obj1.callStaticFunction();
std::cout << "静态变量的值: " << MyClass::getStaticVar() << std::endl; // 输出: 静态变量的值: 300
return 0;
}