现在的位置: 首页 > 综合 > 正文

C++学习-静态成员(6)

2013年10月24日 ⁄ 综合 ⁄ 共 1895字 ⁄ 字号 评论关闭

作者:gzshun. 原创作品,转载请标明出处!
来源:http://blog.csdn.net/gzshun

静态成员的提出是为了解决数据共享的问题。

一、静态数据成员
静态数据成员是同一个类中所有对象共享的成员,而不是某一对象的成员。因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。

二、如何定义一个静态数据成员
1.使用关键词static声明静态数据成员。(在类中)
2.对静态数据成员进行初始化。(在类外)
由于静态数据成员要分配空间,因此不能在类声明中进行初始化。静态数据成员初始化在类的外部进行,与一般数据成员的初始化不同。
static数据成员的初始化格式:
<数据类型> <类名>::<静态数据成员> = <值>;

静态数据成员的使用例子:

#include <iostream>

using namespace std;

class CObj
{
public:
    CObj()
    {
        mObjs++;
    }
    static int GetObjs()
    {
        return mObjs;
    }
private:
    static int mObjs; //声明静态数据成员
};

int CObj::mObjs = 0; //静态数据成员的初始化

int main()
{
    CObj objs[10];
    cout << "CObj类总共创建了" << CObj::GetObjs() << "对象" << endl;
    return 0;
}

执行结果:

CObj类总共创建了10对象


二、静态成员函数-->(没有this指针)

静态成员函数和静态数据成员一样,它们都属于类的静态成员,都不是对象成员。因此对静态成员的引用不需要用对象名,不过用对象名来引用也是可以的。
注:在静态成员函数的实现中,不能直接引用类中的非静态成员,可以引用类中说明的静态成员。但静态成员函数中可以间接的引用非静态成员,可以通过对象来引用。

来个例子,说明在 静态成员函数中,可以直接引用静态数据成员,但不能直接引用非静态数据成员,非静态数据成员必须通过对象来引用。

#include <iostream>

using namespace std;

class CObj
{
public:
    CObj()
    {
        mObjs_static++;
    }
    static void ShowData(CObj obj)
    {
        //mObjs_nonstatic = mObjs_static; //错误,不能直接引用非静态成员
        obj.mObjs_nonstatic = mObjs_static;
        cout << "直接引用: " << "CObj类总共创建了" << mObjs_static << "对象" << endl;
        cout << "间接引用: " << "CObj类总共创建了" << obj.mObjs_nonstatic << "对象" << endl;
    }
private:
    static int mObjs_static; //声明静态数据成员
    int mObjs_nonstatic;
};

int CObj::mObjs_static = 0; //静态数据成员的初始化

int main()
{
    CObj obj1, obj2, obj3;
    obj1.ShowData(obj1);
    cout << endl;
    CObj::ShowData(obj2);
    return 0;
}

执行结果:

直接引用: CObj类总共创建了3对象
间接引用: CObj类总共创建了3对象

直接引用: CObj类总共创建了3对象
间接引用: CObj类总共创建了3对象


三、const的static成员
上面已经说了,类的static数据成员,不能在类的声明中初始化,只能在类外进行初始化。但这里存在一种特殊情况,如果该静态数据成员是一个常量表达式,那么它就能够在类中进行初始化。
初始化的格式是:static const <数据类型> <变量名> = <值>;
例子:

#include <iostream>

using namespace std;

class CObj
{
public:
    static const int State_Mount  = 0;
    static const int State_Umount = 1;
};

int main()
{
    cout << "State_Mount  = " << CObj::State_Mount << endl
         << "State_Umount = " << CObj::State_Umount << endl << endl;

    CObj obj;
    cout << "State_Mount  = " << obj.State_Mount << endl
         << "State_Umount = " << obj.State_Umount << endl;
    return 0;
}

执行结果:

State_Mount  = 0
State_Umount = 1

State_Mount  = 0
State_Umount = 1


抱歉!评论已关闭.