class
test
void f1()
void f2(int value)
};
乙個類定義如上,那麼下面的幾種分別會輸出什麼樣的結果呢?
int main()
a:會編譯錯誤
b:執行coredump
c:輸出helloworld
d:以上均不對
答案應該是c。這個普通成員函式不依賴虛表,不訪問成員變數,函式入口是固定位址,不依賴具體例項。
如果是採用如下的呢?
int main()
則是會core dump的,這訪問了成員函式,而指標卻指向了null。
所有的函式都是存放在**區,不管是全域性函式,還是成員函式。要是成員函式占用類的物件空間,那麼將是多麼可怕的事情:定義一次類物件就有成員函式占用一段空間。所以設計者早就設計好,實現共用。
我們再來補充一下靜態成員函式的存放問題吧:靜態成員函式與一般成員函式的唯一區別就是沒有this指標,因此不能訪問非靜態資料成員。正如前面提到的,所有函式都存放在**區,靜態函式也不例外。所有有人一看到 static 這個單詞就主觀的認為是存放在全域性資料區,是不對的。對於靜態成員變數,確實是放在全域性資料區。
資料成員可以分為靜態變數、非靜態變數兩種。
靜態成員:靜態類中的成員加入static修飾符,即是靜態成員,可以使用類名+靜態成員名訪問此靜態成員,因為靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以,靜態成員不能訪問非靜態成員,因為靜態成員存在於記憶體,所以非靜態成員可以直接訪問類中的靜態成員。
非靜態成員:所以沒有加static的成員都是非靜態成員,當類被例項化後,可以通過例項化的類名進行訪問,非靜態成員的生存期決定於該類的生存期,而靜態成員則不存在生存期 的概念,因為靜態成員始終駐留在記憶體中。
定義:在全域性變數前加上關鍵字static,該變數就被定義成乙個靜態全域性變數。
特點:
#include
using
namespace
std;
void fun()
特點:
a、該變數在全域性資料區分配記憶體
b、初始化:如果不是顯式初始化,那麼將被隱式初始化為0,以後的函式呼叫不再進行初始化。
c、它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域。當定義它的函式或語句塊結束時,其作用域也隨之結束。
靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其他檔案使用。
所以定義靜態函式的好處:靜態函式不能被其他檔案使用。在其他檔案中可以定義相同名字的函式,不會發生衝突。
由乙個typedef問題引發的思考
同樣,可以像下面這樣隱藏指標語法 typedef char pstr intmystrcmp const pstr p1,const pstr p3 用gnu的gcc和g 編譯器,是會出現警告的,按照順序,const pstr 被解釋為 char const 乙個指向char的指標常量 而事實上,c...
由乙個經典布局問題引發的思考
相信每個前端玩家在初學css的時候都遇到過這麼乙個問題 如何實現乙個三欄布局。假設高度已知,左欄右欄寬度各300px 中間自適應。看似很簡單的乙個問題,但這麼簡單的乙個問題,可以體現出乙個前端玩家的段位水平。初級玩家的回答 1.浮動 2.絕對定位。中級玩家的回答 1.浮動 2.絕對定位 3.flex...
由乙個DAOHelper類引發的思考
這是一篇發牢騷的文章,可以這麼說吧。daohelper究竟有什麼用呢?用我自己的話去理解,daohelper的存在正是敏捷開發的產物,即快速開發。我們究竟能從專案中學到什麼呢?有的人可能會說,從乙個專案中,你可以學到很多東西,比如你可以學習nhibinate,entity framework 等or...