類的靜態(tài)成員

  • 在成員聲明之前加上 static 使其與類關聯(lián)到一起;和其他的類成員是相同的,靜態(tài)成員可以是 public 或 private 的。并且靜態(tài)成員的類型可以是 常量、引用、指針、類 類型等;

  • 類的靜態(tài)成員存在與任何對象之外,對象也不包含任何與靜態(tài)成員有關的數(shù)據(jù)。

  • 類的靜態(tài)函數(shù)不與任何對象綁定在一起,它們不包含 this 指針。作為結果,靜態(tài)成員不能聲明成 const 的【因為我們在定義一個類對象的時候,實際上只給該對象的非靜態(tài)的數(shù)據(jù)成員分配內存空間(假設沒有虛函數(shù)),而該類的靜態(tài)成員數(shù)據(jù)以及該類的函數(shù)都在編譯的時候分配到一個公共的空間里,所有,在定義一個對象并調用類對象的函數(shù)的時候,函數(shù)根本不知道到底是哪個對象調用了他,怎么解決這個問題呢,C++利用傳遞this指針的方式來實現(xiàn),調用一個類對象里的函數(shù)的時候,將把這個對象的指針傳遞給他,以便函數(shù)對該對象的數(shù)據(jù)進行操作,對于一個定義為const的函數(shù),傳遞的是const的this指針,說明不能更改對象的屬性,而對static成員的函數(shù)不需傳遞this指針,所有就不需要用const來修飾static的成員函數(shù)了!就說const屬性的作用就是對被傳遞的this指針加以限定,而對static成員函數(shù)的調用根本不傳遞this指針,所有不需const來修飾static的成員函數(shù)~~~~ 從對象模型上來說,類的非static成員函數(shù)在編譯的時候都會擴展加上一個this參數(shù),const的成員函數(shù)被要求不能修改this所指向的這個對象;而static函數(shù)編譯的時候并不擴充加上this參數(shù),自然無所謂const。 因為const成員函數(shù)的const是修飾this所指指物的也就是this將會被聲明為const CLASSNAME*。 而static不存在this指針,所以const對static member function的修飾是無效的。 static member怎么看都是活在CLASSNAME NAMESPACE中的普通事物?!?,而且我們也不能在 static 函數(shù)體內使用 this 指針。限制即使用this的顯示使用,也對調用非靜態(tài)成員的隱式使用有效。

靜態(tài)成員的使用

  1. 通過使用作用域運算符訪問靜態(tài)成員
int a;
a  =  Account :: rate();  // rate()函數(shù)是 Accout 類中的靜態(tài)函數(shù)
  1. 即使靜態(tài)成員不屬于類的某個對象,但是仍然能使用類的對象、引用或指針來訪問靜態(tài)成員;
Account  ac1;
Account  *ac2 = &ac1;
ac1.rate();  /* 通過類的對象 或 類的對象的引用來調用類的靜態(tài)成員 */
ac2->rate();  /* 通過指向對象的指針調用類的靜態(tài)成員 */
  1. 成員函數(shù)不使用作用域運算符就能直接使用靜態(tài)成員
class Accout{
public:
    void test{
      count << a << endl;
  }
private:
  static int a;
}
  1. 定義靜態(tài)成員
    和其他的成員函數(shù)相同,既可以在類內部也可以在類外部定義靜態(tài)成員函數(shù)。但是在類外定義靜態(tài)成員函數(shù)的時候,并且在類外定義時要指定類名,不能重復 static 關鍵字,static 關鍵子只能出現(xiàn)在類的內部聲明語句;
    因為靜態(tài)數(shù)據(jù)成員不屬于類的任何一個對象,所以它們并不是在創(chuàng)建類對象的時候被定義,這意味著它們不是由類的構造函數(shù)初始化的;
  • 通常我們不能在類內初始化靜態(tài)成員,必須在類外進行定義和初始化每個靜態(tài)成員,和其他對象一樣,一個靜態(tài)數(shù)據(jù)成員只能定義一次;
class A{
private:
      static int b;  // b是在class A中的聲明,而不是定義
}
  • 定義靜態(tài)數(shù)據(jù)成員
    靜態(tài)數(shù)據(jù)成員定義在任何函數(shù)之外,類似全局變量,因為一旦被定義將存在與程序的整個生命周期;
    定義靜態(tài)數(shù)據(jù)成員和類外定義成員函數(shù)類似:目標對象的類型 、類名、作用域預算符和成員自己的名稱;
/* 定義并初始化一個靜態(tài)成員 */
int  Accout::static_value = intRate();
/*
 *定義了名為static_value的對象,該對象是 Account的靜態(tài)成員,類型是 int ,從類名開始,語句的剩下的部分就是位于類的作用域之內了,所以能夠直接使用intRate函數(shù):
*/

Note:即使 intRate 函數(shù)是私有的,和其他的函數(shù)一樣,static_value的初始化能夠訪問私有的函數(shù);

  • 成員函數(shù)的類內初始化




最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容