作是类的成员,由该类型的所有对象共享访问,对该类的多个对象来说,静态数据成员只分配一次内存。 静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。 也就是说,你每new一个Rectangle,并不会为static int s_sum的构建一份内存拷贝,它是不管你new了多少Rectangle的实例,因为它只与类Rectangle挂钩,而跟你每一个Rectangle的对象没关系。
2、静态成员函数:用于修饰 class 的成员函数。 我们对上面的例子稍加改动:
#include
using namespace std;
class Rectangle
{
private:
int m_w,m_h;
static int s_sum;
public:
Rectangle(int w,int h)
{
this->m_w = w;
this->m_h = h;
s_sum += (this->m_w * this->m_h);
}
static void GetSum() //这里加上static
{
cout<
GetSum(); cout<
上面注释可见:对GetSum()加上static,使它变成一个静态成员函数,可以用类名::函数名进行访问。 那么静态成员函数有特点呢? 1.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数; 2.非静态成员函数可以任意地访问静态成员函数和静态数据成员; 3.静态成员函数不能访问非静态成员函数和非静态数据成员; 4.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常) 前三点其实是一点:静态成员函数不能访问非静态(包括成员函数和数据成员),但是非静态可以访问静态,有点晕吗?没关系,我给你个解释, 因为静态是属于类的,它是不知道你创建了10个还是100个对象,所以它对你对象的函数或者数据是一无所知的,所以它没办法调用,而反过来,你创建的对象是对类一清二楚的(不然你怎么从它那里实例化呢),所以你是可以调用类函数和类成员的,就像不管GetSum是不是static,都可以调用static的s_sum一样。