为了实现一个类的多个对象之间的数据共享,C++提出了静态成员的概念。
静态成员包括:
静态数据成员和静态成员函数
静态成员的作用:
1.静态成员不属于某一个对象,而属于一个类(属于所有对象),无论建立多少个对象,都共享静态成员——是连接各个对象的桥梁。
2.静态数据成员主要用于各个对象共用数据。如:总数的统计、平均数等。
静态数据成员的定义:
static 数据类型 数据成员名;
class student
{
private:
int num;
char* name;
static float score;
};
静态数据成员可以初始化,但只能在类外进行
格式: 数据类型 类名::静态数据成员 = 初值;
说明:
1)静态数据成员可以说明为公有的、私有的或保护的,说明为公有的可直接通过类名来访问。
类名 ::静态成员名
2)私有或保护静态数据成员只能通过公有成员函数访问。
3)静态成员不同于全局变量——封装在类内部,使用静态数据成员取代全局变量,使数据更为安全;
结论:当在类中需要共享某一数据成员时应定义为静态数据成员。
#include<iostream>
using namespace std;
class box
{
public:
int width; int length;
static int height;
box(int w, int l);
int volume();
};
int box::height = 10;
box::box(int w, int l)
{
width = w;
length = l;
}
int box::volume()
{
return width * length * height;
}
int main()
{
box a(10, 20), b(20, 30);
cout << a.height << endl;
cout << b.height << endl;
cout << a.volume() << endl;
cout << b.volume() << endl;
return 0;
}
静态数据成员的存储:
在所有对象之外单独开辟空间存储,只要在类中定义了静态数据成员,即使不定义任何对象,也为静态数据成员分配空间,它可以在尚未建立对象时通过类名引用。
在类中使用静态数据成员后,只要某一个对象改变了其值,整个类的对象相应的静态数据成员的值均改变。
有效解决办法:
静态成员函数——访问静态数据成员
静态成员函数的定义:
static 返回类型 函数名(参数列表);
{… };
如: static float averge( )
{return (sum/3) ;}
静态成员函数的调用:
1)静态成员函数属于一个类,可用类名调用。
格式: 类名 :: 静态成员函数名(实参表);
2)静态成员可以用对象调用。
格式 : 对象名 . 静态成员函数名(实参表);
说明:
1)静态成员函数可以在类内部定义,也可在类外定义。
如:类中声明: static float averge();
类外定义: float student::averge( )
{return (sum/3); }
2)静态成员函数无this指针(this指针属于某一对象,静态成员属于令个类),主要用来访问静态数据成员,不能直接访问非静态数据成员,如果要访问非静态数据成员,需加上对象名。
3)普通成员函数可以调用静态成员函数;
4)构造函数和析构函数不能是静态的。
结论:当在类中定义有静态数据成员时,通常应定义静态成员函数来访问静态数据成员。
#include<iostream>
using namespace std;
class student
{
public:
student(int n,string m,float s):num(n),name(m),score(s){}
void total();
static float averge();
private:
int num;
string name;
float score;
static float sum;
};
float student::sum = 0;
void student::total() { sum += score; }
float student::averge() { return (sum / 3); }
int main()
{
student stu[3] = {student(1,"zhangsan",89),student(2,"lisi",85),student(3,"wangwu",75)};
for (int i = 0; i < 3; ++i)
{
stu[i].total();
}
cout << "averge=" << student::averge() << endl;
return 0;
}