C++静态类成员
<上一节
下一节>
C语言中也用static来修饰变量,C++中除了修饰变量外还可以修饰类的成员:
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分钟入门教程
x = 322 y = 3.14
MAX_LEN = 100
MIN_LEN = 10
- 修饰函数中的局部变量,这个变量在这个函数中,无论调用多少次都是共有的。
- 修饰全局变量,则这个变量在当前文件中有效。在另一文件中,即使是同一程序也不再有效。
- 修饰类的成员变量或成员函数,则这个类无论产生多少实例,这个成员都是共有的。
- static修饰的变量的初始值为0。
- 在类的静态成员函数中不能使用this指针,也不能作成静态虚函数。
- 类的静态成员函数不能用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, "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
<上一节
下一节>