静态成员

作者:jicanmeng

时间:2014年11月30日


在类中,静态成员变量是使用static修饰的成员变量,它是由所有这个类的对象所共享的。类似的,静态成员函数是使用static修饰的成员函数,它由所有这个类的对象所共享。

  1. 静态成员变量(static member variables)
  2. 静态成员函数(static member functions)

1. 静态成员变量(static member variables)

静态成员变量的使用方法如下:

  1. 在类中使用关键字static声明静态成员变量。在类中声明静态成员变量,仅仅说明了静态成员变量是类中的成员这个关系,即使我们使用该类定义对象时,该静态成员变量也不会分配内存空间。可以说,类中声明的静态成员变量是一种形式上的虚的成员变量。静态成员变量的实际定义是由下一步完成的。
  2. 在类外为静态成员变量分配内存空间并初始化。类中普通的成员变量的内存空间是在对象定义时分配的,但是静态成员变量的内存空间是由该类的所有对象所共享的,只能分配一次,不能通过定义类对象的方式来分配,必须在类的外部进行实际定义才能被所有对象所共享。定义格式如下:
    <数据类型> <类名>::<静态成员变量名>=<值>

看一个示例程序:

#include <iostream>

class Something
{
public:
    static int s_nValue;
};

int Something::s_nValue = 1;

int main()
{
    Something cFirst;
    cFirst.s_nValue = 2;

    Something cSecond;
    std::cout << cSecond.s_nValue << std::endl;

    Something::s_nValue = 3;
    std::cout << cSecond.s_nValue << std::endl;

    return 0;
}

看一看运行结果:

[jicanmeng@andy tmp]$ g++ staticMemberVar.cpp
			[jicanmeng@andy tmp]$ ./a.out
			2
			3
			[jicanmeng@andy tmp]$

几点说明:

1. 静态成员变量的实际定义和初始化本身是不受public,protected和private访问属性限制的。

2. 静态成员变量是属于类的,可以通过"<类名>::<静态成员变量名>"的方式来访问(如上面代码中的19行)。另外,当静态成员变量的访问属性为public时,也可以通过"对象.静态成员变量名"的方式来访问。

2. 静态成员函数(static member functions)

静态成员函数和静态成员变量一样,是属于类的,并且被所有的类的对象所共享。可以通过"<类名>::<静态成员函数名>"的方式来访问。另外,当静态成员函数的访问属性为public时,也可以通过"对象.静态成员函数名"的方式来访问。

有一点需要注意:静态成员函数只能访问静态成员变量

看一个示例程序:

#include <iostream>

class IDGenerator
{
private:
    static int s_nNextID;

public:
     static int GetNextID() { return s_nNextID++; }
};

// We'll start generating IDs at 1
int IDGenerator::s_nNextID = 1;

int main()
{
    for (int i=0; i < 5; i++)
        std::cout << "The next ID is: " << IDGenerator::GetNextID() << std::endl;

    return 0;
}

参考资料

  1. <<C++实用教程>> 电子工业出版社 郑阿奇 主编 丁有和 编著
  2. The C++ Tutorial:
    http://www.learncpp.com/cpp-tutorial/811-static-member-variables/
    http://www.learncpp.com/cpp-tutorial/812-static-member-functions/