C++ 關於static variables的學習中遇到的問題總結

JUAN425發表於2014-08-05

類的資料成員可以修飾為靜態的。 一個靜態成員有如下特點:

(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)呼叫靜態成員函式的時候, 使用的是類名(雖然也可以使用物件點運算的形式, 因為是該類所有的物件共享的, 所以當然也可以使用物件。 只不過用類名界符號定更加常見)





相關文章