C++静态类成员

C语言中也用static来修饰变量,C++中除了修饰变量外还可以修饰类的成员:

静态成员变量

下面演示静态成员变量的初始值、修改后的值和调用方法。
#include <iostream>
#include <string>
using namespace std;

class classA {
    static int sx;
    static string sstr;
public:
    static int sy;
    void set(int x, string s) {
        sx = x;
        sstr = s;
    }
    void print() {
        cout << "  x = " << sx ;
        cout << "  y = " << sy ;
        cout << "  s = " << sstr << endl;
    }
};

//下面的申明是必须的,这样不会改变访问权限(public,private)
int classA::sx;
string classA::sstr;
int classA::sy;

int main ( )
{
    classA ca1, ca2;
    cout << "ca1: ", ca1.print();   //实例1的初始值
    cout << "ca2: ", ca2.print();   //实例2的初始值

    ca1.set(25, "C语言中文网");    //设定实例1,实例2 也会改变
    ca1.sy = 100;       //公有静态成员可以通过实例来设定
    cout << "ca1: ", ca1.print();   //实例1的设定值
    cout << "ca2: ", ca2.print();   //实例2的设定值

    ca2.set(80, "C++ 60分钟入门教程");    //设定实例2,实例1 也会改变
    classA::sy = 125;   //公有静态成员也可以不通过实例来设定
    cout << "ca1: ", ca1.print();   //实例1的设定值
    cout << "ca2: ", ca2.print();   //实例2的设定值

    return 0;
}
运行结果:
ca1:   x = 0  y = 0  s =
ca2:   x = 0  y = 0  s =
ca1:   x = 25  y = 100  s = C语言中文网
ca2:   x = 25  y = 100  s = C语言中文网
ca1:   x = 80  y = 125  s = C++ 60分钟入门教程
ca2:   x = 80  y = 125  s = C++ 60分钟入门教程

静态成员函数

笔者多年从事Java程序设计,按Java的经验,静态成员函数一般在公共程序中用的比较多。这样的程序与类自身关系不大,只是归类性质放在某个类中。还有一些与类转换或交换但不需要实例时使用的情况。
#include <iostream>
using namespace std;

class Integer {
public:
    static int atoi(const char *s) {
        return ::atoi(s);
    }
    static float atof(const char *s) {
        return ::atof(s);
    }
};

int main ( )
{
    int x = Integer::atoi("322");
    float y = Integer::atof("3.14");
    cout << "x = " << x << "  y = " << y << endl;

    return 0;
}
运行结果:
x = 322  y = 3.14

类的静态常数

和静态成员变量类似功能,当不允许修改时,要定义成常数。
#include <iostream>
using namespace std;

class Integer {
public:
    static const int MAX_LEN = 100;
    static const int MIN_LEN = 10;
};

//以下的申明不需要
//int Integer::MAX_LEN;
//int Integer::MIN_LEN;

int main ( )
{
    cout << "MAX_LEN = " << Integer::MAX_LEN << endl;
    cout << "MIN_LEN = " << Integer::MIN_LEN << endl;

    return 0;
}
运行结果:
MAX_LEN = 100
MIN_LEN = 10