C++分析讲解类的静态成员函数如何使用

 更新时间:2022年04月23日 10:10:15   作者:清风自在 流水潺潺  
与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员,静态成员函数没有this指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行默认访问

一、未完成的需求

  • 统计在程序运行期间某个类的对象数目
  • 保证程序的安全性(不能使用全局变量)
  • 随时可以获取当前对象的数目

C++分析讲解类的静态成员变量是什么中每次打印对象的个数时,都需要依赖于一个对象名,下面看一个代码:

#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", gTest.getCount);
    return 0;
}

按理说 count 应该输出为 0,但是 gTest 对象没有定义,所以编译就会报错:

有没有什么解决办法呢?下面再看一段代码:

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

输出结果如下,Test::cCount = 1000; 可以认为是意外导致这个赋值,这样别人就会误认为这里面有 1000 个对象,这是不对的。

直接通过类名访问成员变量也是不可取的,安全性会打折扣。

那到底该怎么做呢?且看下面。

二、问题分析

需要做的事情

  • 不依赖对象就可以访问静态成员变量
  • 必须保证静态成员变量的安全性
  • 方便快捷的获取静态成员变量的值

三、静态成员函数

在 C++ 中可以定义静态成员函数

  • 静态成员函数是类中特殊的成员函数
  • 静态成员函数属于整个类所有
  • 可以通过类名直接访问公有静态成员函数
  • 可以通过对象名访问公有静态成员函数

静态成员函数的定义

直接通过 static 关键字修饰成员函数

下面看一个静态成员函数示例:

#include <stdio.h>
class Demo
{
private:
    int i;
public:
    int getI();
    static void StaticFunc(const char* s);
    static void StaticSetI(Demo& d, int v);
};
int Demo::getI()
{
    return i;
}
void Demo::StaticFunc(const char* s)
{
    printf("StaticFunc: %s\n", s);
}
void Demo::StaticSetI(Demo& d, int v)
{
    d.i = v;
}
int main()
{
    Demo::StaticFunc("main Begin...");
    Demo d;
    Demo::StaticSetI(d, 10);
    printf("d.i = %d\n", d.getI());
    Demo::StaticFunc("main End...");
    return 0;
}

输出结果如下:

当然,把Demo::StaticSetI(d, 10); 换成 d.StaticSetI(d, 10); 也是可以的哈,对应于前面讲的可以通过类名直接访问公有静态成员函数,也可以通过对象名访问公有静态成员函数。

如果把void Demo::StaticSetI(Demo& d, int v) 这里变成:

void Demo::StaticSetI(int v)
{
    i = v;
}

编译器就会报错:

这是因为静态成员函数不能直接访问成员变量,可以通过对象名访问公有静态成员函数。

静态成员函数 vs 普通成员函数

 静态成员函数普通成员函数
所有对象共享YesYes
隐含 this 指针NoYes
访问普通成员变量(函数)NoYes
访问静态成员变量(函数)YesYes
通过类名直接调用YesNo
通过对象名直接调用YesYes

所以,满足 1. 统计在程序运行期间某个类的对象数目 2.保证程序的安全性(不能使用全局变量) 3.随时可以获取当前对象的数目的最终解决方案如下:

#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());
    Test t1;
    Test t2;
    printf("count = %d\n", t1.GetCount());
    printf("count = %d\n", t2.GetCount());
    Test* pt = new Test();
    printf("count = %d\n", pt->GetCount());
    delete pt;
    printf("count = %d\n", Test::GetCount());
    return 0;
}

输出结果如下:

四、小结

  • 静态成员函数是类中特殊的成员
  • 函数静态成员函数没有隐藏的 this 参数
  • 静态成员函数可以通过类名直接访问
  • 静态成员函数只能直接访问静态成员变量(函数)

到此这篇关于C++分析讲解类的静态成员函数如何使用的文章就介绍到这了,更多相关C++静态成员函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 位图及位图的实现原理

    C++ 位图及位图的实现原理

    位图实际上就是一个数组,因为数组有随机访问的功能,比较方便查找,这个数组一般是整形,今天通过本文给大家分享c++位图的实现原理及实现代码,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • C++ Effective详解

    C++ Effective详解

    下面小编就为大家带来一篇C++ Effective的文章。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-08-08
  • 一文带你简单了解c++正则表达式

    一文带你简单了解c++正则表达式

    正则表达式在匹配字符串,验证输入合法性时经常用到.C++ 11标准库中已经支持了正则表达式,下面这篇文章主要给大家介绍了关于c++正则表达式的相关资料,需要的朋友可以参考下
    2023-04-04
  • C 语言基础之C语言的常见关键字

    C 语言基础之C语言的常见关键字

    C语言中有一些预先定义的字符串,他们本身被赋予了自身的功能。并且我们在定义变量的时候,不能去抢他们的名字来用。他们就是今天的主角:关键字,下面文章将给大家做详细介绍
    2021-09-09
  • C语言数据结构中树与森林专项详解

    C语言数据结构中树与森林专项详解

    这篇文章主要介绍了C语言数据结构中树与森林,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • VC++中进程与多进程管理的方法详解

    VC++中进程与多进程管理的方法详解

    这篇文章主要介绍了VC++中进程与多进程管理的方法,以实例形式详细分析了进程与多进程管理中所涉及的进程、子进程、进程的互斥运行与进程的结束等概念与具体实现方法,非常具有参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C++ Primer中&、*符号的多重定义与int *p和int* p的区别讲解

    C++ Primer中&、*符号的多重定义与int *p和int* p的区别讲解

    今天小编就为大家分享一篇关于C++Primer中&、*符号的多重定义与int *p和int* p的区别讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • C++类型转换运算符详解

    C++类型转换运算符详解

    这篇文章主要介绍了C++类型转换运算符的相关资料,希望通过本文大家能够掌握这部分内容,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • 详解C语言结构体中的char数组如何赋值

    详解C语言结构体中的char数组如何赋值

    这篇文章主要给大家介绍了关于C语言结构体中的char数组如何赋值的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • C++ 二叉树的实现超详细解析

    C++ 二叉树的实现超详细解析

    二叉树可以简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。本文将详细介绍一下C++中二叉树的实现和遍历,需要的可以参考一下
    2022-03-03

最新评论