C++ 静态成员2025年3月17日 | 阅读 7 分钟 大多数情况下,你设计的类使得该类的任何两个实例都是独立的。也就是说,如果我们有两个对象,一个和两个,对一个的更改不应该以任何方式影响另一个。但是,在某些情况下,我们会希望在类的所有副本之间共享数据。例如,我们希望类的所有副本都能访问单个全局资源,或者也许在创建类的第一个实例时有一些我们想要调用的初始化代码。因此,C++ 提供了 `static` 关键字来创建由该类的所有副本共享的类特定的信息。与 `const` 一样,`static` 也有细微之处,有时会适得其反。因此,本讲义讨论了静态成员函数、它们与 `const` 的关系以及静态数据成员。 在 C++ 中使用 `static` 关键字有两种方式。它们是
静态数据成员静态数据成员是使用“static”关键字声明的成员。 当我们声明一个数据成员为 `static` 时,无论是在类内部还是在类外部,它都被称为静态数据成员。即使存在许多类对象,静态数据成员也只有一个副本。它总是初始化为零,因为它的默认值是零。它是所有类对象的共享内存,并保留其值。 语法换句话说,静态数据成员是类特定的变量,每个类实例共享。如果我们有多个类实例,每个实例都使用该变量的同一个副本,因此对静态数据成员的更改会影响多个对象。声明静态数据成员的语法令人困惑,因为它分两个步骤——**声明和定义**。例如,假设你有以下类定义 从上面可以看出,**myStaticData** 声明了一个带有 `static` 关键字的静态数据成员。但是,**`static int myStaticData`** 这一行并没有创建 **`myStaticData`** 变量。相反,它只是告诉编译器变量 **`myStaticData`** 必须在某个点被声明。因此,要初始化 `myStaticData`,我们需要在程序中添加另一行,看起来像这样 int MyClass::myStaticData = 137; 这里有几点需要注意。首先,在声明变量时,我们必须使用完全限定名 **`MyClass::myStaticData`** 而不是 `myStaticData`。其次,我们在变量声明时不要重复 `static` 关键字——否则,编译器会认为我们正在做一些完全不同的事情。最后,虽然 `myStaticData` 被声明为 `private`,但我们仍然可以在类定义外部声明它。静态数据之所以需要这种分两部分的声明/定义,原因有点技术性。这涉及到编译器在哪里为变量分配存储空间,所以现在,记住静态数据必须单独声明和定义。 类中的数据成员可以声明为 `static`。静态数据成员具有某些特殊的特征。它们是
除了声明之外,静态数据成员在几乎所有方面看起来都像普通数据成员。考虑 `MyClass` 的以下名为 `doSomething` 的成员函数 这里的代码看起来都很正常,并且这段代码将正常工作。但请注意,当我们修改 `myStaticData` 时,我们正在修改任何其他 `MyClass` 实例可能正在访问的变量。因此,重要的是要确保我们仅在确定信息不特定于任何类时才使用静态数据。 静态成员函数如果我们创建一个类成员函数作为静态成员函数,它将只访问静态数据成员。如果我们没有任何类对象,它也可以访问。 成员函数定义成员函数 成员函数可以在两个地方定义
类中的成员函数可以声明为 `static`。静态成员函数具有某些特殊的特征,它们是
在成员函数内部,一个名为 `this` 的特殊变量充当指向当前对象的指针。每当我们访问实例变量时,我们都在访问此指针的实例变量。 C++ 如何知道 `this` 指向哪个值?答案微妙但重要。假设我们有一个类 `MyClass`,其中有一个名为 `doSomething` 的成员函数,它接受两个整数参数。每当我们使用以下语法在 `MyClass` 对象上调用 `doSomething` 时:`myInstance.doSomething(a, b);` 类内的成员函数
成员函数声明的代码输出 ![]() 说明 在上面的程序中,`getdata()` 和 `display()` 成员函数在类内的 `public` 部分定义。在 `main()` 中,声明了对象 `one`。我们知道对象可以访问类的公共成员。对象 `one` 调用公共成员函数 `getdata()` 并初始化其值,然后调用 `display()` 来显示结果。你正在调用 doSomething(&myInstance, a, b); 其中 `doSomething` 被声明为 void doSomething(MyClass *const this, int a, int b) 对于几乎所有意图和目的,这是一个细微的差别,从你作为程序员的角度来看,应该不太重要。但是,一个 N 参数的成员函数是 N+1 参数的自由函数这一事实会在一些地方引起问题。例如,假设你正在编写一个 `Point` 类,如下所示 如果我们有一个我们想传递给 STL `sort` 算法的 vector,如果我们尝试使用此语法,我们将遇到麻烦 sort(myVector.begin(), myVector.end(), &Point::compareTwoPoints); 问题在于 `sort` 函数需要一个接受两个参数并返回 `bool` 的函数。但是,我们提供了一个有三个参数的函数:两个要比较的点和一个隐式的 **“this”** 指针。因此,上述代码将产生错误。 类外的成员函数 当函数很大时,在类外部定义成员函数。要定义类外的函数,应遵循以下步骤
语法 以下示例说明了在类外部定义的函数。 输出 ![]() 成员函数的特征
下一个主题C++ 静态变量 |
数学运算是任何编程领域的重要组成部分,可用于解决各种类型的问题。对于 C++ 和平方根,最突出的函数之一是 `sqrtl`。在这篇博文中,我们将讨论语法、代码示例……
阅读 3 分钟
Pair 是一个用于组合两个值(可能数据类型不同)的术语。Pair 提供了一种在存储中将两个不同的对象保存在一起的方法。本质上,我们使用它来存储元组。Pair 容器是一个简单的容器,它在……中指定。
阅读 3 分钟
在 main 函数内外的函数声明与全局变量和局部变量相同。当我们在 main 函数外部声明任何函数时,它就是全局定义的,并且位于全局作用域。当我们定义 main 函数中的任何函数时...
阅读 3 分钟
C++ 是一种强大而通用的编程语言。它支持广泛的编程范式,包括并发。并发是指程序中同时执行多个执行线程的能力。它能提高性能和响应能力,尤其是在涉及 I/O 绑定或……的应用程序中。
阅读 6 分钟
在基类中声明了关键字 virtual 的成员函数,并在派生类中重新定义(重写)的函数称为虚函数。后期绑定指令指示编译器在运行时执行调用的函数,通过……
阅读 3 分钟
C++ 提供了大量的数据结构,以实现高效灵活的编程。两个常用的容器是 `Forward List` 和 `List`,它们各有其特点和用途。在本文中,我们将讨论 `Forward List` 和……之间的区别。
阅读 6 分钟
:归并排序是一种流行的排序算法,它使用“分而治之”的原理有效地对元素列表或数组进行排序。归并排序的工作原理概述如下:Divide:如果元素数量为奇数,则将未排序的列表分成两个相等的(或...
阅读 10 分钟
PID 控制器是一种控制回路反馈机制,广泛用于工程应用以维持系统行为。控制器接收输入信号,将其与期望的设定点进行比较,并生成输出信号以驱动系统更接近……
阅读 4 分钟
在本文中,您将了解 C++ 中的 flat_map 及其示例。什么是 flat_map?一种称为 flat_map 的数据结构结合了 vector 和 map 的特征。本质上,它是一个有序的关联容器,它存储键值对,其中...
5 分钟阅读
?C++ ios 基类包含用于格式化 cout 对象的方面,这些对象显示各种格式化特征。使用类范围的静态常量,以下 ios 基类可以样式化 cout 对象以显示尾随小数点,在正整数前添加 +,以及各种其他格式化功能。静态常量...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India