靜態(static)成員是c++中類的一種特殊的成員。
在程式中,我們有時希望多個物件公用乙個變數,但是使用全域性變數會破壞類的封裝性。靜態成員就是為解決此問題而設計。靜態成員的作用域在整個類中,它有全域性變數的優點,又不會像全域性變數那樣破壞類的封裝性。
一、靜態成員的定義
在類中,在成員函式名或者成員變數名前新增static關鍵字,則宣告此成員為靜態成員。
static關鍵字只能出現在類中,在類外定義成員函式時不能新增此關鍵字。
二、靜態成員的特性
靜態成員與普通的成員不同,有幾個特性值得注意。
1、靜態成員不屬於任何物件,它是屬於類的。
在使用時,靜態成員儲存在記憶體中的全域性變數區。它不屬於類的物件,但是我們可以將它當成物件的成員一樣呼叫。如果它是public的,物件可以直接訪問,如果它是private的,物件不能直接訪問。通常,將靜態資料成員放到private中,否則物件就可以很容易的對靜態成員修改,這樣就破壞了類的封裝性。
2、靜態成員函式的特點。
靜態成員函式不屬於物件,所以靜態成員函式不可宣告為const,不可宣告為virtural,也沒有this引數。
3、靜態資料成員(static date member)的特點。
靜態資料成員和靜態成員函式有些不同。
(1)它可宣告為任何型別,如靜態常量(const static)、靜態引用、靜態陣列、靜態類等等。
(2)靜態資料成員只能在類中宣告,必須在類外定義。由於它屬於類,而不屬於物件,因此靜態資料成員也不能出現在物件的建構函式初始化列表中。
(3)靜態常資料成員可以在類中指定初始值,但是仍需要在類外定義。
三、靜態常資料成員(static const data member)
靜態常資料成員非常特殊,它有兩個關鍵字,乙個是static,乙個是const。靜態常資料成員從本質上來說仍然是靜態成員,它仍然是靜態成員,是類的一部分,不屬於物件。由於加了const關鍵字,它同時具有了常成員的特性。
這裡不討論常成員函式,只考慮常資料成員。乙個資料成員被宣告為常成員,則物件不可改變它的值。在常成員的宣告和定義時,都必須出現const關鍵字。常成員必須指定其初始值,初始化常成員的唯一機會是在建構函式初始化列表。
靜態常資料成員也具有上述特性,我們來看看它是如何定義的。
靜態常資料成員的定義分為兩步,這是因為它是靜態成員。
(1)通常我們將靜態常資料成員宣告在類的private部分中。定義形式如下:
static const 型別 變數;
或static const 型別 變數=初始值; (static和const的順序不重要,可交換)
(2)在類外定義靜態常資料成員,形式如下:
const 型別 變數=初始值;
或
const 型別 變數; (一定要加上關鍵字const,型別和const可交換)
由於它是靜態的,所以我們必須在類中宣告,在類外定義。由於它是常量,所以我們必須指定它的初始值。我們可以在類中宣告它的時候指定它的初始值,也可以在類外定義它時指定初始值。需要注意的時,我們只能指定一次,如果我們在類中宣告時指定其初始值,那麼我們在類外定義的時就不要指定其初始值,否則會報錯,反之亦然。
分析靜態常資料成員的定義方式,我們可以看到隱藏在其後的通用原理——類的抽象性。
注:用static和const定義的成員,稱為const static member,按照英文為常靜態成員,在本文中將其譯為靜態常成員,這是因為國內大部分的書習慣稱之為靜態常量。將「靜態」放在前面,「常」放在後面,因為我們習慣了「常量」的稱呼。在定義時,static和const的順序無關緊要,但是在宣告時,我們可以看到必須加上const關鍵字,很多時候我們將const和函式名或變數名視為乙個整體。
四、從靜態常量看類的抽象性
類的乙個重要特徵就是具有抽象性。什麼是抽象性?所謂抽象,是指類是一些物件共性的集合。簡單點說,我們定義了乙個類,它是一種資料型別,和int這樣的內建型別一樣,我們可以認為它不占用記憶體(這裡的記憶體比較狹義,不是說類不占用任何記憶體,而是說,類不像變數那樣占用記憶體)。
對於內建型別,當我們定義乙個變數時,我們就為這個變數分配了記憶體。對於類,當我們定義了類的乙個物件時,這就為這個物件分配了記憶體。
因為類是抽象的,所以類中出現的一切都是抽象的,無論是類的成員函式還是類的成員變數,也無論是const,還是static。正是由於這個原因,所以我們可以在類中定義類的成員函式,卻不能在類中定義成員變數。類中的成員變數,都是宣告,而不是定義。宣告與定義的區別就在於,定義時會為定義的物件分配記憶體空間,而宣告則不會這樣。因為類中的成員變數是宣告,所以,我們無法為成員變數賦初值。對於const成員變數,為了保證其不可改變的特性,我們在類的建構函式初始化列表中初始化它;對於static成員變數,由於它不屬於物件,不能使用類的建構函式初始化列表初始化它,所以我們必須在類外定義它。這就是static成員變數需要在類外定義的元嬰。對於const static成員變數,我們可以在類中指定其初始值,這是為了體現它const的特性,並不是真正意義上的初始化,實際上初始化的過程,仍然是在類外定義的時候完成。
之前的文章講述了建構函式,類是抽象的,類的例項化的過程就是在類的物件的構造函式呼叫時完成的。
結論:(1)類是抽象的,類的任何特性都表現了其抽象性;
(2)建構函式的作用是用來例項化類,定義物件的資料成員,為物件的各個成員分配記憶體(有待商榷)。
(3)如果乙個類的資料成員不屬於物件,那麼不能用建構函式來完成它的定義。
(4)不能用建構函式定義的成員變數,必須使用其他方式定義,比如在類外定義它。
the end
設計模式之抽象工廠模式的學習心得
對於抽象工廠模式,我們首先要明白的是 其是建立在工廠模式基礎之上的,其也屬於建立型設計模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯示指定它們的類,每個生成的工廠都能按照工廠模式提供物件。理解 建立抽象工廠類來獲取工廠物件,建立繼承抽象類的工廠類,生成實體類物件以及建立乙個工廠創...
個人關於抽象類限制的學習心得,希望大家會喜歡
package cm.abstracts.limit 這個類用來測試static定義的內部的抽象類,其作用是乙個外部抽象類 public class modelffourtyone 建立抽象類 外部抽象類,外部父類 abstract class su ce 抽象類必須有子類,乙個子類只能繼承乙個抽象...
C 學習筆記 類的靜態成員
前言 靜態成員是指宣告為 static 的類成員 靜態資料成員 不屬於任何物件,不會因物件的建立而產生,也不會因物件的析構而刪除,它是類的一部分,所以使用靜態資料成員不會破壞類的隱蔽性。1 初始化 必須對靜態資料成員進行初始化,但它與一般資料成員不同,其初始化不能在建構函式中進行。一般格式 資料型別...