服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++分析讲解类的静态成员函数如何使用

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

2022-11-14 13:57清风自在 流水潺潺 C/C++

与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员,静态成员函数没有this指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行默认访问

一、未完成的需求

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

在【C++基础入门】20.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 对象没有定义,所以编译就会报错:

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", Test::cCount);
  Test::cCount = 1000;
  printf("count = %d\n", Test::cCount);
  return 0;
}

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

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

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

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

 

二、问题分析

需要做的事情

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

 

三、静态成员函数

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

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

静态成员函数的定义

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

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

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

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

输出结果如下:

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

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

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

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

编译器就会报错:

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

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

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

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

所以,满足 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;
}

输出结果如下:

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

 

四、小结

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

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

原文链接:https://blog.csdn.net/weixin_43129713/article/details/124260491

延伸 · 阅读

精彩推荐
  • C/C++枚举和宏的区别详细解析

    枚举和宏的区别详细解析

    枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有,宏不是语言的一部分,它是一种预处理替换符...

    C语言教程网8922020-12-31
  • C/C++C语言初阶之数组详细介绍

    C语言初阶之数组详细介绍

    大家好,本篇文章主要讲的是C语言初阶之数组详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    build小春宝9712022-08-01
  • C/C++浅谈C++中char型变量的地址输出

    浅谈C++中char型变量的地址输出

    下面小编就为大家带来一篇浅谈C++中char 型变量的地址输出。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    一正4482021-06-03
  • C/C++关于C++虚继承的内存模型问题

    关于C++虚继承的内存模型问题

    C++虚继承的内存模型是一个老生常谈的话题,实现方法主要依赖于编译器,本文从多个角度通过代码详解C++中虚继承的内存模型知识,感兴趣的朋友跟随小...

    彼 方9172021-11-21
  • C/C++C++求逆序对的方法

    C++求逆序对的方法

    这篇文章主要介绍了C++求逆序对的方法,包含了字符串常见的操作方法,是非常实用的技巧,需要的朋友可以参考下...

    C++教程网12202021-02-03
  • C/C++C++表达式new与delete知识详解

    C++表达式new与delete知识详解

    这篇文章主要为大家详细介绍了C++表达式new与delete知识点,学习如何动态创建对象,动态创建的对象与一般对象的区别,动态创建的对象的初始化以及释放...

    wqli7772021-04-02
  • C/C++使用pthread库实现openssl多线程ssl服务端和客户端

    使用pthread库实现openssl多线程ssl服务端和客户端

    使用pthread库实现openssl多线程ssl服务端和客户端,大家参考使用吧...

    C语言教程网7552021-01-14
  • C/C++VS2013安装配置和使用Boost库教程

    VS2013安装配置和使用Boost库教程

    这篇文章主要为大家详细介绍了VS2013安装配置和使用Boost库的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    yangykaifa9202021-05-08