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