C++ 關於static variables的學習中遇到的問題總結
類的資料成員可以修飾為靜態的。 一個靜態成員有如下特點:
(1)靜態成員不屬於物件, 屬於類。 利用該類建立的物件共享這個資料成員。 或者說, 靜態資料成員屬於類, 而非物件的。 其他的普通的資料成員不同。 我們每一次利用這個類建立物件, 都有屬於建立的物件的資料私有的成員。 函式是所有的物件的共享的。 在C++ 的最新標準C++11 中, 只有const static 的變數可以在class內部初始化(class 的definition 一般位於.h 標頭檔案中), 非const 的靜態的資料變數只能夠在class外部進行初始化, 一般放置在相關介面函式的implementations的.cpp 檔案中。
(2)無論建立多少個物件 , 都有一份static variable。
(2)靜態成員的生存期是整個程式的執行期。
靜態成員一般用於維護整個類的通用值。 比如某個靜態資料變數可以作為計數器, 用於記錄類物件的宣告的個數。
舉個bank account例子:
bank.h:
#ifndef BANK_H
#define BANK_H
#include <iostream>
#include <string>
using namespace std;
class Bank {
public:
//default constructor
Bank();
//overload constructor
Bank(string, int, double);
//destructor
~Bank();
//accessor function
string getName() const;
int getAccountNumber() const;
double getBalance() const;
//mutator functions
void setName(string);
void setAccountNumber(int);
void setBalance(double);
void deposit(double);
void withdraw(double);
static void printBankInfo();
private:
//member variables
string name;
int accountNumber;
double balance;
static int totalAccount ;// must initialize in the implementation file, ie outside the class definition
static double bankBalance;
};
#endif
如果上圖中, 在class內部中對static variable初始化,l例如: static int totalAccount = 0 ; 會出現如下報錯。所以改回來。
bank.cpp檔案:
#include "Bank.h"
// static member variables
double Bank::bankBalance = 0;
int Bank::totalAccount = 10000;
Bank::Bank() {
accountNumber = 0;
balance = 0.0;
totalAccount++;
}
Bank::Bank(string newName, int newAccount, double newBalance) {
string name = newName;
accountNumber = newAccount;
balance = newBalance;
totalAccount++;
bankBalance += newBalance;
}
Bank::~Bank() {
totalAccount--;
bankBalance -= balance;
}
string Bank::getName() const {
return name;
}
int Bank::getAccountNumber() const {
return accountNumber;
}
double Bank::getBalance() const {
return balance;
}
//mutator functions
void Bank::setName(string newName) {
name = newName;
}
void Bank::setAccountNumber(int newAccountNumber) {
accountNumber = newAccountNumber;
}
void Bank::setBalance(double newBalance) {
bankBalance -= balance;
balance = newBalance;
bankBalance += balance;
}
void Bank::deposit(double amount) {
balance += amount;
bankBalance += amount;
}
void Bank::withdraw(double amount) {
balance -= amount;
bankBalance += amount;
}
void Bank::printBankInfo() {
cout << endl << "Number of accounts: " << totalAccount << endl;
cout << "total balance: " << bankBalance << endl;
}
注意上面, 雖然在bank.h 中靜態變數和靜態函式的宣告中均使用了關鍵字static, 但是在bank.cpp 的實現檔案中, 並沒有用static 關鍵字。
如果我們在這個bank.cpp 中使用了static 關鍵字, 例如:static double Bank::bankBalance = 0; 出現錯誤如下:
所以改回來。
主程式main.cpp 檔案如下:
#include <iostream>
#include <string>
#include "Bank.h"
using namespace std;
int main()
{
Bank::printBankInfo();
cout << "Adam create an account and deposit 500";
Bank Adam("Adam", 0001, 500);
Bank Sarah;
cout << endl << "Sarah create an account and deposit 1000";
Sarah.setName("Sarah");
Sarah.setAccountNumber(0002);
Sarah.setBalance(1000);
Bank::printBankInfo();
cout << "Dick creates an account and deposits 1500";
Bank Dick("Dick", 0003, 1500);
Bank::printBankInfo();
cout << endl << "Dick set his balance to 1200";
Dick.setBalance(1200);
Bank::printBankInfo();
cout << endl << "Sarah deposited 700";
Sarah.deposit(700);
Bank::printBankInfo();
cout << "Adam's account was terminated due to lack of use.";
Adam.~Bank();
Bank::printBankInfo();
return 0;
}
執行結果如下:
下面說說靜態成員函式。
靜態成員函式有如下特點:
(1)靜態成員函式只能訪問類中宣告的其他靜態成員(即靜態成員函式和靜態成員變數)。
(2)呼叫靜態成員函式的時候, 使用的是類名(雖然也可以使用物件點運算的形式, 因為是該類所有的物件共享的, 所以當然也可以使用物件。 只不過用類名界符號定更加常見)
相關文章
- Vue學習遇到疑問的總結Vue
- 關於PCA降維中遇到的python問題小結PCAPython
- 關於工作中遇到的問題
- loadrunner學習中遇到的問題
- weex學習中遇到的問題
- vue專案中遇到的問題總結Vue
- React開發中遇到的問題總結React
- 學習Java中遇到的繼承問題Java繼承
- 學習vue過程中遇到的問題Vue
- 關於 Laravel 遷移遇到的問題Laravel
- 關於操作駁回遇到的問題
- c++使用遇到的問題C++
- 專案中遇到的RediS快取問題及面試問題總結Redis快取面試
- Android中使用WebView遇到的問題總結:AndroidWebView
- 2017年秋季遇到的相容問題總結
- 總結一下最近遇到的問題
- 關於Java中分層中遇到的一些問題Java
- 學習本站Laravel教程中遇到的問題筆記Laravel筆記
- 關於 pytest Case 遇到重試的問題
- 學習httprunner遇到的問題記錄HTTP
- 關於MQTT 使用遇到問題MQQT
- 提交Spark作業遇到的NoSuchMethodError問題總結SparkError
- 升級 node18 遇到的問題總結
- 總結一下本週遇到的問題
- C++關於DLL中建立套接字的問題(求教)C++
- 關於C++當中的指標懸空問題C++指標
- 關於ubuntu安裝中過程遇到問題Ubuntu
- c++學習總結C++
- 學習Python遇到的熱門問題整理Python
- JS/JSP學習的一些問題總結JS
- 關於學習 Linux 系統結構的一些總結Linux
- 機器學習問題方法總結機器學習
- Android學習: 疑難問題總結Android
- Windows安裝Filebeat遇到問題總結Windows
- laravel開發中遇到的問題與bug修復的一些總結Laravel
- 剛開始學習nlp時遇到的問題
- 關於Android studio中遇到Library has broken以及mac遇到clean消失問題AndroidMac
- C++學習隨筆——關聯容器的迭代器失效問題C++
- 初次使用EasyUI框架外掛遇到的問題及總結UI框架