第26课 类的静态成员函数

1. 静态成员函数

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

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

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

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

【编程实验】静态成员函数示例

#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;
}

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


静态成员函数


普通成员函数


所有对象共享


Yes


Yes


隐含this指针


No


Yes


访问普通成员变量/函数


No


Yes


访问静态成员变量/函数


Yes


Yes


通过类名直接调用


Yes


No


通过对象可直接调用


Yes


Yes

【编程实验】解决方案

#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;
}

3. 小结

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

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

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

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

时间: 2024-10-27 08:38:43

第26课 类的静态成员函数的相关文章

第29课 类中的函数重载

函数重载回顾: 类中的重载: 万变不离其宗: 类中的普通成员函数和静态成员函数也够成重载. 示例程序: 1 #include <stdio.h> 2 3 class Test 4 { 5 int i; 6 public: 7 Test() 8 { 9 printf("Test::Test()\n"); 10 this->i = 0; 11 } 12 13 Test(int i) 14 { 15 printf("Test::Test(int i)\n"

第25课 类的静态成员变量

1. 成员变量的回顾 (1)通过对象名能够访问public成员变量 (2)每个对象的成员变量都是专属的 (3)成员变量不能在对象之间共享 2. 静态成员变量 (1)C++中的静态成员变量 ①静态成员变量属于整个类所有 ②静态成员函变量的生命期不依赖于任何对象 ③可以通过对象名,也可以通过类名直接访问公有静态成员变量 ④所有对象共享类的静态成员变量 (2)静态成员变量的特性 ①在定义时直接通过static关键字修饰 ②静态成员变量在程序内部位于全局数据区,所以需要类外为其单独分配空间.(因为new

类的静态成员函数和静态成员变量的使用

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关.静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关. 静态数据成员的用途之一是统计有多少个对象实际存在. 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的.也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一

C++ 类的静态成员及静态成员函数

对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员和静态方法. 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变量.(因为静态成员变量在对象创建之前就已经被分配了内存空间) 静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放).静态成员变量是在程序编译时分配空间,而在程序结束时释放空间. 静态成员的定义和声明要加个关键static.静态成员可

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

[email&#160;protected]类的静态成员变量和静态成员函数

参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2011/01/24/1943199.html 分析Qt程序时,碰到下面代码. QString str = QString("QFrame#avatar{border-image:url(%1.jpg)}").arg( QString::number(i) );   静态成员变量 静态成员函

面向对象课后深入学习(C++ 类的静态成员详细讲解)

今天在刚申请了博客,一下午都在写那个随笔,所以说好的来看c++的也放在了最后,下星期就考试了,这个类的静态成员是我不是很懂的,在网上 看到一片很详细的博客考下来回去慢慢看. 在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存. 静态成员的定义或声明要加个关键static.静态成员可以通过双冒号来使用即<类名>::<静态成员名>.

C++静态成员函数不能调用非静态成员变量

其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话 因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在 类的整个生存周期里始终只能存在一份.然而非静态成员变量和非静态成员函数 是针对类的对象而言. 然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能 调用具体实例对象的成员. 下面我们来测试一下: 先在静态成员函数中调用静态成员变量: 1 #include <iostream> 2 using namespace std; 3 4

静态成员函数(面向对象的static关键字)

静态成员函数 与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是某一个类的具体对象服务.静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分.普通的成员函数一般都隐含一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的.通常情况下,this都是缺省的.如函数fn()实际是this->fn().但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针.从这个意义上讲,它无法访问属于类对象