搜索
您的当前位置:首页正文

C++ 静态数据成员 静态成员函数 使用实例

来源:二三娱乐

注意:本文中代码均使用 Qt 开发编译环境
C++ 静态成员

关键字static有三个明显的作用:

  1. 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
  2. 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
  3. 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

我们今天主要看两个使用方法:
(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();
}

输出结果,如下图所示:

输出结果
Top