C++ 中的静态函数
本文将演示如何在 C++ 中使用类的静态成员函数。
使用 static
成员函数访问 private
static
成员变量
static
关键字可在 C++ 中用于声明与类本身而不是任何特定实例相关联的类的成员。
静态成员变量在类体内声明,但不能同时初始化,除非它们是 constexpr
限定的、const
限定的整数类型或 const
限定的 enum
。因此,我们需要像初始化任何其他全局变量一样在类定义之外初始化非常量静态成员。
请注意,即使给定的静态成员具有 private
说明符,也可以使用类范围解析运算符在全局范围内访问它,因为 BankAccount::rate
在以下代码片段中初始化。一旦 rate
成员在程序开始时被初始化,它就会一直存在,直到程序终止。如果用户未显式初始化静态成员,编译器将使用默认初始化程序。
#include <iostream>
#include <string>
using std::cout; using std::cin;
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::cout; using std::cin;
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
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn