注意:本文中代码均使用 Qt 开发编译环境
C++ 静态成员
关键字static有三个明显的作用:
- 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
- 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
- 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
我们今天主要看两个使用方法:
(1)静态数据成员
用关键字static声明;该类的所有对象维护该成员的同一个拷贝;必须在类外定义和初始化,用(::)来指明所属的类。
(2)静态成员函数
类外代码可以(但非必须)使用类名和作用域操作符来调用静态成员函数;静态成员函数只能引用属于该类的静态数据成员或静态成员函数。
关于这个静态数据成员呢,我们以后在处理和使用“单例模式”的时候会经常用到,但是我们今天不是要讲单例模式,我们就是感受一下静态数据成员和静态成员函数的使用方法。
下面我们写一个具有静态数据成员和静态成员函数的Point类。
#include <QCoreApplication>
#include <QDebug>
class Point
{
public:
Point(int xx=0,int yy=0)
: X(xx)
, Y(yy)
{
countP++;
}
Point(Point &p);
int getX(){
return X;
}
int getY(){
return Y;
}
static int count(){
qDebug()<<"Object count: "<<countP;
return countP;
}
private:
int X,Y;
static int countP;
};
Point::Point(Point &p) {
qDebug()<<"i`m a copy!";
X = p.X;
Y = p.Y;
countP++;
}
int Point::countP = 0;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Point A(4,5);
qDebug()<<"Point A, "<<A.getX()<<","<<A.getY();
Point::count();
A.count();
Point B(A);
qDebug()<<"Point B, "<<B.getX()<<","<<B.getY();
B.count();
Point::count();
return a.exec();
}
输出结果,如下图所示: