c++中可以對類中私有成員中的靜態變量初始化嗎?


轉載http://www.cnblogs.com/carbs/archive/2012/04/04/2431992.html

問題:我看的書上寫的對私有部分的訪問可以是公共部分的成員函數,也可以是友員函數,那么可以直接對私有部分的靜態成員進行初始化嗎? 回答:
1.static成員的所有者是類本身和對象,但是多有對象擁有一樣的靜態成員。從而在定義對象時不能通過構造函數對其進行初始化。
2.靜態成員不能在類定義里邊初始化,只能在class body外初始化。
3.靜態成員仍然遵循public,private,protected訪問准則。
4.靜態成員函數沒有this指針,它不能返回非靜態成員,因為除了對象會調用它外,類本身也可以調用。
#include <iostream>
#include <string>
using namespace std;

class Account {
public:
 Account(string name, int money):owner(name), amount(money) { }
       //Account(string name, int money, double rate):owner(name), amount(money), interestRate(rate) { } // 是錯誤的
 ~Account() { }
 double applyint()
 {
  amount += amount * interestRate;
  return amount;
 }
//如果將applyint()聲明為static double applyint()則錯誤,因為amount不是//靜態成員
 static double rate()
 {
  return interestRate; // 注意返回值
 }
 static void rate(double);
 static double interestRate;//public,其他非成員可以訪問
private:
 string owner;
 double amount;
 //static double interestRate;  // private, 成員和友元才可訪問
 static double initRate();
};

double Account::interestRate = 2.0; //正確的靜態成員初始化
//double Account::interestRate = Account::initRate();//用靜態成員函數對靜態成員進行初始化,正確,因為private成員可以訪問private成員,以上兩種初始化只能選其一
//Account::interestRate  = 3.0; //錯誤,不能通過編譯,原因不明,按編譯結果看,編譯器將這個賦值語句當做對靜態成員的初始化(因為編譯器提醒少了類型:double)。但主函數中可以通過,見下
double Account::initRate() 
{
 return 2.0;
}
//所有的靜態成員在類體外定義時都不再寫static
void Account::rate(double newRate)
{
 interestRate = newRate;
}

int main ()
{
 Account Yang("Yang", 10); //interestRate = 2.0
 cout << Yang.applyint() << endl;
         cout << Yang.applyint() << endl;//注意兩個結果不一樣,因為amount第一次調用之后就變了。
 Yang.rate(4.0);
 cout << Yang.applyint() << endl;//interestRate = 4.0
 cout << Account::interestRate << endl; //public靜態成員
 Account::interestRate = 3.0; //對應上面的賦值語句
 cout << Yang.applyint() << endl;//interestRate = 3.0
 Account Ning("Ning", 200);//interestRate = 3.0
         cout << Ning.applyint() << endl;
         Yang.interestRate = 6.0; // 也可以,並且還改了類中的靜態成員值
 Account Pei("Pei", 2);// interestRate=6.0
 cout << Pei.applyint() << endl; 
}
好了,就這些了!其中的數字只是為了數據的明顯,沒有實際意義!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM