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指针,而静态成员函数就没有  这就导致了静态成员函数可以直接访问本类中的所有静态数据成员,因为静态数据成员同样也是类的一部分,就可以直接访问,静态成员函数不访问类中的非静态成员

相关文章
|
1月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
40 5
|
3月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
156 5
|
4月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
4月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
163 6
|
4月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
62 0
|
4月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
46 3
|
4月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
709 1
|
4月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
67 1
|
4月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
92 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)