C++ 中的静态函数

Jinku Hu 2023年10月12日
C++ 中的静态函数

本文将演示如何在 C++ 中使用类的静态成员函数。

使用 static 成员函数访问 private static 成员变量

static 关键字可在 C++ 中用于声明与类本身而不是任何特定实例相关联的类的成员。

静态成员变量在类体内声明,但不能同时初始化,除非它们是 constexpr 限定的、const 限定的整数类型或 const 限定的 enum。因此,我们需要像初始化任何其他全局变量一样在类定义之外初始化非常量静态成员。

请注意,即使给定的静态成员具有 private 说明符,也可以使用类范围解析运算符在全局范围内访问它,因为 BankAccount::rate 在以下代码片段中初始化。一旦 rate 成员在程序开始时被初始化,它就会一直存在,直到程序终止。如果用户未显式初始化静态成员,编译器将使用默认初始化程序。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class BankAccount {
 private:
  //    static double rate = 2.2; / Error
  static double rate;
  double amount;

 public:
  explicit BankAccount(double n) : amount(n) {}
  static double getRate() { return rate; }
  static void setNewRate(double n) { rate = n; }
};

double BankAccount::rate = 2.2;

int main() {
  BankAccount m1(2390.32);
  BankAccount m2(1210.51);

  return EXIT_SUCCESS;
}

BankAccount::rate 不是存储在每个 BankAccount 对象中。只有一个与 BankAccount 类关联的 rate 值,因此,每个实例在给定时刻都将访问相同的值。这种行为在类设计中非常有用,但在这种情况下,我们将重点关注 static 成员函数。

后者通常用于访问静态成员变量,因为当类的用户想要与它们交互时,成员访问控制说明符适用。

也就是说,如果我们想要检索具有 private 说明符的 rate 的值,我们需要有一个相应的 public 成员函数。此外,我们不想使用单独的调用对象访问这些成员,因为类本身只有一个值。

因此,我们实现了一个名为 getRate 的函数,一个静态成员函数并返回 rate 的值。然后我们可以直接从 main 函数访问 rate 的值,而无需构造 BankAccount 类型的对象。请注意,静态成员函数没有可用的 this 隐式指针,并且它们无法访问/修改类的非静态成员。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class BankAccount {
 private:
  static double rate;
  double amount;

 public:
  explicit BankAccount(double n) : amount(n) {}
  static double getRate() { return rate; }
  static void setNewRate(double n) { rate = n; }
};

double BankAccount::rate = 2.2;

int main() {
  cout << BankAccount::getRate() << endl;
  BankAccount::setNewRate(2.4);
  cout << BankAccount::getRate() << endl;

  return EXIT_SUCCESS;
}

输出:

2.2
2.4
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Static