在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。
由于编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址。也就是说静态成员函数即使在类对象不存在的情况下也能被调用,只要使用类名加范围解析运算符 :: 就可以访问静态成员函数。
静态成员函数有一个类范围,他们不能访问类的 this 指针。您可以使用静态成员函数来判断类的某些对象是否已被创建。
例:
#include <iostream>
namespace testfunc
{
class Line
{
public:
static int objectCount;
// 构造函数定义
Line(double l = 2.0) //带有默认值的构造函数
{
std::cout <<"Constructor called." << std::endl;
length = l;
// 每次创建对象时增加 1
objectCount++;
}
double GetLength()
{
return length;
}
static int getCount()
{
return objectCount;
}
private:
double length; // 长度
};
// 初始化类 Line 的静态成员
int Line::objectCount = 0;
}
//test
int main(void)
{
// 在创建对象之前输出对象的总数
std::cout << "Inital Stage Count: " << testfunc::Line::getCount() << std::endl;
testfunc::Line line1(3.0); // 声明 line1
testfunc::Line line2(8.0); // 声明 line2
// 在创建对象之后输出对象的总数
std::cout << "Final Stage Count: " << testfunc::Line::getCount() << std::endl;
return 0;
}
上例的输出结果为
Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2
ps:类的静态成员变量
我们可以使用 static 关键字来把类成员定义为静态的。
静态成员在类的所有对象中是共享的。这意味着无论创建多少个类的对象,静态成员都只有一个副本。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。
我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化