C语言中,若在一个函数中定义了静态变量,在函数结束的时候该静态变量并不释放,仍然存在并保留其值,通过下面的程序可以测试。</span>
void test()
{
static int a=2;
++a;
printf("%d\n",a);
}
int main()
{
test();
test();
system("pause");
return 0;
}
在C++中,因为类的出现,static除了具有C语言中的特点之外,还可以用来修饰数据成员和成员函数。分两种情况:1.静态数据成员 2.静态成员函数
1.静态数据成员
静态数据成员可以实现同类多个对象之间的数据共享(使用全局变量的话会影响安全性,并且不符合封装的原则),
静态数据成员的在内存中只占一份存储空间,它不属于某一个具体的对象,而是属于类。
静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。
静态数据成员的初始化只能在类体外进行,形式: 数据类型 类名::静态数据成员值=值;
静态数据成员值可以通过对象名引用,也可以通过类名引用。
简单说明程序:
#include <iostream>
using namespace std;
class Box
{
public:
Box(int,int);
int volume();
static int height;
int width;
int length;
protected:
private:
};
Box::Box(int w,int l)
{
width=w;
length=l;
}
int Box::volume()
{
return (height*width*length);
}
int Box::height=10;
int main()
{
Box a(15,20),b(20,30);
cout<<a.height<<endl;
cout<<b.height<<endl;
cout<<Box::height<<endl;
cout<<a.volume()<<endl;
system("pause");
return 0;
}
2.静态成员函数
与静态数据成员不同,静态成员函数的的作用不是为了对象之间的沟通,而是为了能够处理静态数据成员。
静态成员函数与非静态成员函数的根本区别是非静态的有this指针(属于对象一部分,调用方式_thiscall),静态的没有this指针(属于类的一部分,而不是对象)。在类外调用公用的静态成员函数,要使用类名和域运算符“::”,也可以通过对象名来掉用静态成员函数,这不意味着该静态成员函数属于对象,只是用对象的类型而已。
静态成员函数可以直接引用本类的静态数据成员,在C++,静态成员函数主要用来访问静态数据成员,而不访问非静态成员(可以访问非静态数据成员,但不能进行默认访问,必须跟着对象)。
非静态的成员函数可以访问类的静态数据成员和对象的非静态数据成员,也可以调用类的非静态和静态的成员函数。静态成员函数可以访问类的静态数据成员、调用静态成员函数(主要用处)和访问非静态数据成员(跟具体对象相关,通过传参等方式)、调用非静态成员函数(跟具体对象相关,通过传参等方式)
说明程序如下:
#include <iostream>
using namespace std;
class Student
{
public:
Student(int n,int a,float s):num(n),age(a),socre(s){ }
void total();
static float average();
protected:
private:
int num;
int age;
float socre;
static float sum;
static int count;
};
void Student::total() //非静态访问静态和非静态
{
sum+=socre;
count++;
}
float Student::average() //静态访问静态,也可通过传参访问非静态(必须指定对象名)
{
return sum/count;
}
float Student::sum=0;
int Student::count=0;
int main()
{
Student stud[3]={
Student(1001,18,70),
Student(1002,19,78),
Student(1003,20,98)
};
int n;
cout<<"Please input the number of students:"<<endl;
cin>>n;
for (int i=0;i<n;i++)
{
stud[i].total();
}
cout<<"the average score of "<<n<<"student is "<<Student::average()<<endl;
system("pause");
return 0;
}
以上内容主要总结、摘抄自谭浩强老师的《C++面向对象程序设计》一书