C++静态数据成员和静态成员函数详解

简介: C++静态数据成员和静态成员函数详解

目录

静态数据成员

结论

注意事项

静态成员函数

静态成员函数的调用


静态数据成员

在C++中,我们可以使用static关键字定义类成员,成员定义为静态的,只要我们将类成员进行成功创建时,那就意味着无论我们创建多少个对象,那么近代成员就始终只有一个副本

首先我们提出一个问题,在对学生成绩统计的案例中,我们如何计算出一共创建了多少个学生对象?接下来我们就用例子演示一遍

#include <iostream>
using namespace std;
class A {
public:
  A() {
    ++count;
  }
  void obj_num() {
    cout << "已经创建了的对象个数:" << count <<endl;
  }
private:
  static int count;
};
int A::count = 0;
int main() {
  A obj[3] = {
    A(),
    A(),
    A()
  };
  obj[2].obj_num();
  obj[3].obj_num();
  A c;
  c.obj_num();
  return 0;
}

输出结果:

已经创建了的对象个数:3

已经创建了的对象个数:3

已经创建了的对象个数:4

结论

我们可以得知对象是类的一个实例,并且创建的每一个对象都具有属于自己的数据成员,但是总有一部分数据,我们想让他们达到多个对象数据共享的目的,但是如果将一个变量定义为全局变量,就会带来严重的不安全性,这与我们类的封装性是有违的,这会严重破坏面向对象程序设计中的信息隐秘的方面,所以我们为了实现同一个类之间多个对象的数据共享,在C++中就提出了静态数据成员的概念,在一个类中,若将一个数据成员定义为static类型,那我这种成员,我们就把他称之为近战成员与一般的成员是不同的,这个进展成员是无论建立多少个类的对象,就始终只有一个静态数据成员的拷贝,就通俗的来说,就是始终只有一个副本,用以上方法就可以很好的解决数据不安全的问题,还可以实现同一个类中不同对象之间数据的共享性

注意事项

静态成员变量必须初始化,并且只能在类的外面进行初始化,在我们初识化的时候可以赋初值,也可以不要,如果我们没给他,赋初值的话,那么就会默认初始化为0,

静态成员函数

 在我们类的定义中,前面有static的成年函数,我们称之为静态成员函数,尽量乘以函数是属于所有类对象共享的成员函数,他不是单单只属于类中的某一个对象,近代成员函数的作用不是为了对象之间的沟通,而是为了处理类中的静态数据成员,静态成员函数的定义格式有以下几种

static 返回类型 静态成员函数名(参数表)

静态成员函数的调用

与静态成员函数相似,调用公有的成员函数的一般格式有以下几种

1、类名::静态成员函数名(实参表)

2、对象.静态成员函数(实参表)

3、对象指针 -> 静态成员函数(实参表)

一般来说静态程序函数是不会访问类中的非静态成员,如果有需要,近代成员函数就只能通过对象名来访问该对象的非静态成员

静态成员函数和非静态成员函数的主要区别就是非静态成员函数有this指针,而静态成员函数就没有  这就导致了静态成员函数可以直接访问本类中的所有静态数据成员,因为静态数据成员同样也是类的一部分,就可以直接访问,静态成员函数不访问类中的非静态成员

相关文章
|
6天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
45 6
|
24天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
47 12
|
15天前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
21 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
2月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
52 5
|
4月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
168 5
|
5月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
5月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
180 6
|
5月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
70 0
|
5月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
101 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
24天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。