一、静态成员概念
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化
二、静态成员变量
class A
{
public:
A()
{
++_scount;
}
A(const A& t)
{
++_scount;
}
~A()
{
--_scount;
}
static int GetACount()
{
return _scount;
}
private:
static int _scount;
};
int A::_scount = 0;
int main()
{
cout << A::GetACount() << endl;
A a1, a2;
A a3(a1);
cout << A::GetACount() << endl;
}
三、静态成员函数
当我们在C++中使用静态函数(也称为静态方法)时,它们具有以下特点和用途:
-
与类本身相关联:静态函数是与类本身相关联的函数,而不是与类的实例对象相关联的。它们属于类的命名空间,而不是类的实例对象。
-
调用时可以不创建实例对象:与非静态成员函数不同,你可以不创建类的实例对象就可以直接使用静态函数。你可以使用类名和范围解析运算符(::)来调用静态函数,例如
ClassName::staticFunction()
。当然也可以通过实例对象对静态函数进行调用。类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问。 -
无法直接访问非静态成员:静态函数没有隐式的
this
指针,因此无法直接访问非静态成员变量或非静态成员函数。如果需要访问非静态成员,你可以使用类的静态成员变量来存储或传递非静态对象的信息。 -
只能直接调用静态成员函数:由于静态函数没有
this
指针,它只能直接调用类的静态成员函数。如果需要调用非静态成员函数,你需要通过创建类的实例对象来调用。 -
非静态函数可以直接调用静态函数。静态成员函数属于类本身,而不是类的实例。静态成员函数在调用时无需引用类的实例,因此可以在非静态成员函数中直接调用静态成员函数。
-
静态函数可以直接访问静态成员但不可以直接访问非静态成员:静态函数可以直接访问和操作静态成员变量和静态成员函数。它们可以访问类的静态成员变量,对其进行修改或使用其值。
-
适用于工具函数和辅助函数:静态函数通常用于实现一些工具函数或辅助函数,这些函数不需要访问特定的对象状态,只需执行某些功能或返回某些结果。
#include <iostream>
class MyClass {
public:
static int staticVar; // 静态成员变量
static void staticFunc() {
std::cout << "This is a static function." << std::endl;
std::cout << "Static variable: " << staticVar << std::endl;
// 访问静态成员变量和调用静态成员函数
anotherStaticFunc();
}
static void anotherStaticFunc() {
std::cout << "This is another static function." << std::endl;
}
};
// 静态成员变量定义
int MyClass::staticVar = 10;
int main() {
MyClass::staticVar = 20; // 直接访问静态成员变量
MyClass::staticFunc(); // 调用静态函数
return 0;
}
总结来说,静态函数是与类本身相关联的函数,无需创建实例对象即可使用。它们无法访问非静态成员变量和非静态成员函数,只能调用静态成员函数。静态函数可以访问和操作静态成员,适用于实现工具函数和辅助函数。