1. 静态成员 (Static Members)
静态成员属于类本身,而不是某个特定的对象。无论创建多少个对象,静态成员只有一份,所有对象共享同一个静态成员。
1.1 静态成员变量
- 静态成员变量在整个程序的生命周期中只存在一份,保存在静态内存区。
- 静态成员变量可以通过类名直接访问,不需要实例化对象。
- 它在程序开始时分配内存,程序结束时销毁。
示例:
class MyClass {
public:
static int staticVar; // 静态成员变量
void show() {
std::cout << "Static Variable: " << staticVar << std::endl;
}
};
// 静态成员变量必须在类外进行定义和初始化
int MyClass::staticVar = 10;
int main() {
MyClass obj1, obj2;
// 所有对象共享同一个静态成员变量
obj1.staticVar = 20;
obj2.show(); // 输出 20
}
在上面的例子中,staticVar
是一个静态成员变量,所有对象 obj1
和 obj2
都共享同一个变量。
1.2 静态成员函数
- 静态成员函数可以访问静态成员变量,但不能访问非静态成员变量,因为它不依赖于具体的对象实例。
- 静态成员函数可以通过类名直接调用,而不需要对象实例。
示例:
class MyClass {
public:
static void staticFunc() {
std::cout << "This is a static function." << std::endl;
}
};
int main() {
MyClass::staticFunc(); // 不需要对象实例即可调用静态函数
}
2. 动态成员 (Non-static Members)
动态成员(也称为实例成员)是属于类的某个特定对象的成员。每创建一个新对象,就会为该对象的动态成员分配独立的内存,且这些成员之间互不干扰。
2.1 动态成员变量
- 动态成员变量每个对象都有自己的一份副本,每创建一个对象,就会为该对象的动态成员变量分配独立的内存。
- 它们只能通过对象实例来访问。
示例:
class MyClass {
public:
int dynamicVar; // 动态成员变量
void show() {
std::cout << "Dynamic Variable: " << dynamicVar << std::endl;
}
};
int main() {
MyClass obj1, obj2;
obj1.dynamicVar = 5;
obj2.dynamicVar = 10;
obj1.show(); // 输出 5
obj2.show(); // 输出 10
}
在这个例子中,dynamicVar
是动态成员变量,每个对象 obj1
和 obj2
都有自己独立的 dynamicVar
,互不影响。
2.2 动态成员函数
- 动态成员函数可以访问类的动态成员变量和静态成员变量。
- 动态成员函数只能通过对象实例调用,因为它需要知道具体操作哪个对象。
示例:
class MyClass {
public:
int dynamicVar;
void dynamicFunc() {
std::cout << "This is a dynamic function. Variable: " << dynamicVar << std::endl;
}
};
int main() {
MyClass obj;
obj.dynamicVar = 10;
obj.dynamicFunc(); // 输出 "This is a dynamic function. Variable: 10"
}
3. 区别总结
内存分配 | 只分配一次,所有对象共享 | 每个对象分配独立内存 |
生命周期 | 随程序的运行周期而存在 | 随对象的生命周期而存在 |
访问权限 | 静态函数只能访问静态成员 | 可以访问静态和非静态成员 |
简言之,静态成员是与类关联的,存在整个程序生命周期中;而动态成员则与对象实例关联,每个对象有独立的动态成员数据和行为。