小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/video/av20868986/
目录
前面讲了这么多类和对象的教程,你应该也知道,类成员变量和类成员函数都是属于对象的,不同的对象之间的成员变量会有不同的值而且成员函数也会有不同的结果,只不过类成员变量和类成员函数都写在类里面,算是对象们共同的规则。
而现在要讲的是静态成员变量和静态成员函数。这些静态成员不是属于某个对象的,静态成员是属于类的,并且所有对象都可以共用这些静态成员。
基础示例 1
下面举个简单的例子:
#include <iostream>
class testclass
{
public:
static int m_counter; // 声明
};
// 定义和初始化
int testclass::m_counter = 666;
int main(void)
{
std::cout << testclass::m_counter << std::endl;
testclass::m_counter = 1024;
std::cout << testclass::m_counter << std::endl;
return 0;
}
输出结果:
666
1024
基础讲解 1
先从静态成员变量的声明和定义开始说。跟非静态成员变量的创建不一样,之间我教程所说的声明,就是声明和定义一起说了,而静态成员变量的声明和定义是需要分开写的。例如上面代码中的静态成员变量m_counter
,在声明的时候需要在前面用关键字static
说明它是静态的,然后必须在全局范围内定义它(也就是为它分配内存),最好顺便初始化。上面代码中的int testclass::m_counter = 666;
,int
是静态成员变量m_counter
的类型,变量名前加上testclass::
说明m_counter
是属于类testclass
的,然后在m_counter
创建完成时给它初始化为666
。
由于静态成员是属于类的,所以可以直接通过类名操作静态成员,不过通过类名操作静态成员需要使用::
,这个跟对象不一样。例如代码中的testclass::m_counter = 1024;
可以直接通过类名操作静态成员变量给它赋值。
基础示例 2
#include <iostream>
class testclass
{
public:
testclass(void);
~testclass(void);
static std::size_t counter(void);
private:
static std::size_t m_counter; // 声明
};
int main(void)
{
std::cout << "1: 现在testclass类的对象数量是:" << testclass::counter() << std::endl;
testclass test1;
std::cout << "2: 现在testclass类的对象数量是:" << testclass::counter() << std::endl;
{
testclass test2;
std::cout << "3: 现在testclass类的对象数量是:" << testclass::counter() << std::endl;
testclass test3;
std::cout << "4: 现在testclass类的对象数量是:" << testclass::counter() << std::endl;
}
std::cout << "5: 现在testclass类的对象数量是:" << testclass::counter() << std::endl;
return 0;
}
std::size_t testclass::m_counter = 0;
testclass::testclass(void)
{
++m_counter;
}
testclass::~testclass(void)
{
--m_counter;
}
std::size_t testclass::counter(void)
{
return m_counter;
}
输出结果:
1: 现在testclass类的对象数量是:0
2: 现在testclass类的对象数量是:1
3: 现在testclass类的对象数量是:2
4: 现在testclass类的对象数量是:3
5: 现在testclass类的对象数量是:1
基础讲解 2
类成员函数都可以访问该类的静态成员,因为静态成员是共用的;而类静态成员函数只能够访问静态成员,因为非静态成员是属于对象而不是类的。静态函数的声明只需要在开头加上关键字static
即可,而定义跟非静态成员函数一样。
上面代码中,当一个对象被创建的时候,都会调用构造函数,而构造函数里都会对静态成员变量m_counter
自增;当对象释放内存的时候,都会调用析构函数,而析构函数里都会对静态成员变量m_counter
自减。这样就实现了一个对象的计数器,可以统计现在一共创建了多少个对象。