由乙個C 問題引發的討論和思考 未完待續

2021-08-08 14:47:21 字數 1371 閱讀 4936

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...