静态成员是解决同一个类的不同对象之间数据和函数共享问题的。
- 实例属性:一个类的所有对象具有相同的属性,属性值可以不同。
- 类属性:描述类的所有对象共同特征,对于任何对象其属性值相同。
静态数据成员
- 用关键字static声明
- 该类的所有对象维护该成员的同一个拷贝
- 必须在类外定义和初始化,用(::)来指明所属的类。
类名::标识符
静态成员函数
- 类外代码可以使用类名和作用域操作符来调用静态成员函数。
- 也可以直接使用对象名来调用静态成员函数。
静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态成员必须通过对象名。
例子:具有静态成员函数和静态数据成员的Point类
代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
class Point //Point类定义
{
public: //外部接口
Point(int xx = 0, int yy = 0) { X = xx; Y = yy; countP++; } //构造函数
Point(Point &p); //复制构造函数
~Point(){ countP--; }
int GetX() { return X; }
int GetY() { return Y; }
static void GetC() { cout << " 对象 id=" << countP << endl; }
//静态函数成员
private: //私有数据成员
int X, Y;
static int countP; //静态数据成员引用性说明
};
Point::Point(Point &p)//复制构造函数
{
X = p.X;
Y = p.Y;
countP++;
}
int Point::countP = 0; //静态数据成员定义性说明
//初始化,使用类名限定
void main() //主函数实现
{
Point A(4, 5); //定义对象A
cout << "Point A," << A.GetX() << "," << A.GetY();
A.GetC(); //输出对象号,对象名引用
Point::GetC();
Point B(A); //定义对象B
cout << "Point B," << B.GetX() << "," << B.GetY();
Point::GetC(); //输出对象号,类名引用
system("pause");
}