程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Inside The C++ Object Model 讀書筆記(二)——靜態成員變量與單例模式

Inside The C++ Object Model 讀書筆記(二)——靜態成員變量與單例模式

編輯:C++入門知識

  還是關於C++對象模型,前一篇讀書筆記中涉及到了靜態成員變量的問題,後來發現需要思考的東西還是有很多的,下面便一一道來。

  首先,類中的static member在計算類的大小時並不計算在內,舉例如下,原因是什麼呢?

View Code

  大部分人應該知道,static member相當於是全局變量,而全局變量是存儲在靜態區裡的,所以和類或者對象是相分離的,因此在計算sizeof(X)時就不會計算在內。既然是static member是全局變量,那麼不管程序中產生多少objects,static member永遠只存在一份實例,甚至即使該類沒有任何實例,其static member也可以已經存在。

  第二,要訪問類的靜態成員,光聲明是不夠的,上面的class X中只是對num的聲明,如果你直接在其他函數中實例化一個對象,並用這個對象訪問static member num,那麼編譯器會給你來上一句類似“fatal error LNK1120: 1 個無法解析的外部命令”的話。為什麼呢?因為類裡面的static int num只是一句聲明而並非定義!如果要訪問一個變量,則它必須要被定義過才行!而定義則必須在類的外部(也不能是其他函數內部,跟定義全局變量一樣)。這裡可以直接在class X的外部直接定義:int X::num = 10; 定義以後就可以直接訪問了。

  說到了靜態成員變量的使用就不由自主的聯想到單例模式的實現,下面也就簡單介紹下單例模式。

  單例模式(Singleton)可能是應用最為廣泛的設計模式,目的是保證對於某個類,只能實例化一個這種類的對象,並提供一個訪問它的全局訪問點。很多情形下可以比對單例模式,比如一個系統中只應該有一個文件系統和一個窗口管理器,某個程序只允許產生一個交互窗口等等。一個常用的實現方法是將創建這個唯一實例的操作隱藏在一個類操作之中,由它保證只有一個實例被創建。這個操作可以訪問保存唯一實例的變量,而且保證在未創建實例時,創建實例。下面給出一種實現:

View Code

  可以自己在main函數裡測試getVar()和setVar()的操作,看是否操作的是同一個實例。

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved