《C++语言教程》17章 静态类成员


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

  1. 修饰函数中的局部变量,这个变量在这个函数中,无论调用多少次都是共有的。
  2. 修饰全局变量,则这个变量在当前文件中有效。在另一文件中,即使是同一程序也不再有效。
  3. 修饰类的成员变量或成员函数,则这个类无论产生多少实例,这个成员都是共有的。
  4. static修饰的变量的初始值为0。
  5. 在类的静态成员函数中不能使用this指针,也不能作成静态虚函数。
  6. 类的静态成员函数不能用const、volatile申明。

一、静态成员变量

下面演示静态成员变量的初始值、修改后的值和调用方法。


#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, "劝学网");    //设定实例1,实例2 也会改变
    ca1.sy = 100;       //公有静态成员可以通过实例来设定
    cout << "ca1: ", ca1.print();   //实例1的设定值
    cout << "ca2: ", ca2.print();   //实例2的设定值

    ca2.set(80, "小雅");    //设定实例2,实例1 也会改变
    classA::sy = 125;   //公有静态成员也可以不通过实例来设定
    cout << "ca1: ", ca1.print();   //实例1的设定值
    cout << "ca2: ", ca2.print();   //实例2的设定值

    return 0;
}

二、静态成员函数

小雅多年从事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;
}

三、类的静态常数

和静态成员变量类似功能,当不允许修改时,要定义成常数。


#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;
}