1 靜態成員:在定義前面新增了static關鍵字的成員。
2 eg:
static int i; // 靜態成員變數
static void init(){} // 靜態成員函式
3 普通成員變數與靜態成員變數的差別
(1)普通成員變數每個物件有各自的乙份,而靜態成員變數一共就有乙份,為所有物件共享。
(2)sizeof運算子不會計算靜態成員變數。
eg:class cmyclass
則,sizeof(cmyclass)等於4,原因是靜態成員變數不是放在物件內部,而是放在所有物件外面,被所有物件共享。
4 普通成員函式與靜態成員函式差別
(1)普通成員函式必須具體作用於某個物件,而靜態成員函式並不具體作用於某個物件。
5 靜態成員不需要通過物件就可以訪問
6 如何訪問靜態成員
(1)類名::成員名 eg: crectangle::printtotal();
(2)物件名.成員名 eg: crectangle r; r.printtotal();
(3)指標->成員名 eg: crectangle* p = &r; p->printtotal();
(4)引用.成員名 eg: crectangle& ref = r; int n = ref.ntotalnumber;
7 靜態成員變數本質上是全域性變數,哪怕乙個物件都不存在,類的靜態成員變數也存在。
8 靜態成員函式本質上是全域性函式
9 設定靜態成員這種機制的目的是將和某些緊密相關的全域性變數和函式寫到類裡面,看上去像乙個整體,易於維護和理解。
10 靜態成員例子(見本工程static.cpp)
/**
* 靜態成員例子
* 考慮乙個需要隨時知道矩形總數和總面積的圖形處理程式
* 可以用全域性變數來記錄總數和總面積
* 用靜態成員將這兩個變數封裝進類中,就容易理解和維護
* */
#include
#include
"crectangle.h"
using
namespace std;
// 必須在定義類的檔案中對靜態成員變數進行一次說明或初始化。否則編譯可以通過,鏈結不能通過。
int crectangle::ntotalnumber =0;
int crectangle::ntotalarea =0;
intmain()
11 在靜態成員函式中,不能訪問非靜態成員變數,也不能呼叫非靜態成員函式。
原因:如下例子
void crectangle::printtotal()
crectangle::printtotal(); // 解釋不通,w到底屬於哪個物件
12 在10中crectangle.cpp有何缺陷?
缺陷產生原因:在使用crectangle類時,有時會呼叫複製建構函式生成臨時的隱藏的crectangle物件。
以下情況會產生缺陷:
呼叫乙個以crectangle類物件作為引數的函式時候
呼叫乙個以crectangle類物件作為返回值的函式時
這兩種情況建立物件的時候不會使用自定義建構函式,而會使用編譯器預設的複製建構函式,但是消亡的時候會呼叫析構函式,因此會產生錯誤。
是否所有建構函式都會使用自定義的建構函式進行初始化呢?不是
臨時物件在消亡的時候會呼叫析構函式,減少ntotalnumber和ntotalarea的值,可是這些臨時物件在生成時候卻沒有增加ntotalnumber和ntotalarea的值
解決辦法:為crectangle類寫乙個複製建構函式。
crectangle::crectangle(crectangle& r)
C 學習筆記之靜態成員
靜態成員就是在成員變數和成員函式前加上關鍵字static,稱為靜態成員。靜態成員分為 class person int person m a 10 int person m b 10 void test01 intmain class person static int m a 靜態成員變數 int...
c 學習筆記九 靜態成員變數和靜態成員函式
靜態成員就是在成員變數和成員函式前加上關鍵字static,稱為靜態成員 靜態成員分為 靜態成員函式 1 靜態成員變數 class person int person m a 10 int person m b 10 void test01 intmain 2 靜態成員函式 class person ...
C 學習筆記 類的靜態成員
前言 靜態成員是指宣告為 static 的類成員 靜態資料成員 不屬於任何物件,不會因物件的建立而產生,也不會因物件的析構而刪除,它是類的一部分,所以使用靜態資料成員不會破壞類的隱蔽性。1 初始化 必須對靜態資料成員進行初始化,但它與一般資料成員不同,其初始化不能在建構函式中進行。一般格式 資料型別...