C语言中也用static来修饰变量,C++中除了修饰变量外还可以修饰类的成员:
修饰函数中的局部变量,这个变量在这个函数中,无论调用多少次都是共有的。
修饰全局变量,则这个变量在当前文件中有效。在另一文件中,即使是同一程序也不再有效。
修饰类的成员变量或成员函数,则这个类无论产生多少实例,这个成员都是共有的。
static修饰的变量的初始值为0。
在类的静态成员函数中不能使用this指针,也不能作成静态虚函数。
类的静态成员函数不能用const、volatile申明。
静态成员变量
下面演示静态成员变量的初始值、修改后的值和调用方法。
#include
#include
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
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
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