第26课 类的静态成员函数

1、未完成的需求

  • 统计在程序运行期间某个类的对象数目

  • 保证程序的安全性不能使用全局变量

  • 随时可以获取当前对象的数目(Failure

 

【编程实验】解决方案的尝试  26-1.cpp

#include <stdio.h>

class Test
{
public:
    static int cCount;
public:
    Test()
    {
        cCount++;
    }
    ~Test()
    {
        --cCount;
    }
    int getCount()
    {
        return cCount;
    }
};

int Test::cCount = 0;


int main()
{
    printf("count = %d\n", Test::cCount);
    
    Test::cCount = 1000;
    
    printf("count = %d\n", Test::cCount);
    
    return 0;
}

运行结果:

  

 

结论:我们需要什么?

  • 不依赖对象就可以访问静态成员变量

  • 必须保证静态成员变量的安全性

  • 方便快捷的获取静态成员变量的值

 

2. 静态成员函数

(1)静态成员函数类中特殊的成员函数,属于整个类所有

(2)可以通过类名直接访问公有静态成员函数

(3)可以通过对象名访问公有静态成员函数

(4)静态成员函数定义:直接通过static关键字修饰成员函数

      

 

【编程实验】静态成员函数示例   26-2.cpp

#include <stdio.h>

 

class Test

{

private:

    int i;

    static int s_j;

public:

 

    int getI();

    static void StaticFunc(const char* s);

    static void StaticSetI(Test&d, int v);

    static int StaticGetJ();

};

 

int Test::getI()

{

    return i;

}

 

void Test::StaticFunc(const char* s)

{

    printf("StaticFunc: %s\n", s);

}

 

void Test::StaticSetI(Test&d, int v)

{

    d.i = v;

    //i = v;//静态成员函数不能访问非静态成员变量

    s_j = v;//合法,访问静态成员变量

}

 

int Test::StaticGetJ()

{

    return s_j;

}

 

int Test::s_j = 0;

 

int main()

{

    Test::StaticFunc("main Begin...");//通过类名调用静态成员函数

 

    Test t;

 

    Test::StaticSetI(t, 10);

 

    printf("t.i = %d\n", t.getI());

    printf("s_j = %d\n", t.StaticGetJ());//通过对象名调用静态成员函数

 

    Test::StaticFunc("main End...");//通过类名调用静态成员函数    

    return 0;

}

运行结果:

  

 

3. 静态成员函数 VS 普通成员函数

 

静态成员函数

普通成员函数

所有对象共享

Yes

Yes

隐含this指针

No

Yes

访问普通成员变量/函数

No

Yes

访问静态成员变量/函数

Yes

Yes

通过类名直接调用

Yes

No

通过对象可直接调用

Yes

Yes

 

 

 

 

 

 

 

 

 

 

 

 

 

【编程实验】解决方案   26-3.cpp

#include <stdio.h>

 

class Test

{

private:

    static int cCount;

public:

    Test(){cCount++;}

 

    ~Test(){--cCount;}

 

     static int getCount(){return cCount;}

};

 

int Test::cCount = 0;

 

 

int main()

{

    printf("count = %d\n", Test::getCount());//0,通过类名调用函数

 

    Test t1;

    Test t2;

 

    printf("count = %d\n", t1.getCount());//2, 通过对象名调用函数

    printf("count = %d\n", t2.getCount());//2, 通过对象名调用函数

 

    Test* pt = new Test();

 

    printf("count = %d\n", pt->getCount());//3

 

    delete pt;

 

    printf("count = %d\n", Test::getCount());//2,通过类名调用函数

    

    return 0;

}

运行结果:

  

 

4. 小结

(1)静态成员函数是类中特殊的成员函数

(2)静态成员函数没有隐藏的this参数

(3)静态成员函数可以通过类名和对象直接访问

(4)静态成员函数只能直接访问静态成员变量/函数,不能访问普通成员变量/函数

posted @ 2018-12-09 17:22  梦心之魂  阅读(218)  评论(0编辑  收藏  举报