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
- weex學習中遇到的問題
- hive學習中遇到的問題Hive
- 關於工作中遇到的問題
- 學習中遇到的javabean中的scope問題JavaBean
- vue專案中遇到的問題總結Vue
- React開發中遇到的問題總結React
- loadrunner學習中遇到的問題
- 關於PCA降維中遇到的python問題小結PCAPython
- hive學習之二:hive sql使用總結及遇到的問題HiveSQL
- 學習vue過程中遇到的問題Vue
- 學習Java中遇到的繼承問題Java繼承
- 關於move tablespace的問題總結
- 【DATAGUARD 學習】學習DATAGUARD 過程中遇到的問題
- 關於exp/imp的總結學習
- 關於學習java中的按位取反(~)的問題Java
- JERSEY學習遇到的問題
- 專案中遇到的RediS快取問題及面試問題總結Redis快取面試
- 部署weblogic遇到的問題總結Web
- 關於SSM與echart結合的問題總結SSM
- 關於 Laravel 遷移遇到的問題Laravel
- 學習本站Laravel教程中遇到的問題筆記Laravel筆記
- 【總結】日常遇到的一些問題相關知識
- static關鍵字的使用總結
- 關於echarts使用的常見問題總結Echarts
- 關於修改分割槽表的問題總結
- 關於Java中分層中遇到的一些問題Java
- 關於EJB的學習曲線的問題
- 關於 Laravel 中 Ajax 問題的小結Laravel
- 總結一下最近遇到的問題
- c++使用遇到的問題C++
- 學習httprunner遇到的問題記錄HTTP
- Amigo學習(一)解決使用中遇到的問題Go
- 關於struts開發時遇到的問題
- 徹底學會使用epoll(六)——關於ET的若干問題總結
- Java關於初始化問題的總結(一)Java
- 關於ora-02391問題的總結
- 關於C++ const 的全面總結C++