C 中類的編譯順序 過程及注意事項

2021-10-06 21:29:17 字數 1352 閱讀 9385

結論在前:

類的編譯分4步:

1.類名

2.成員名稱

3.成員函式的返回值和形參

4.成員函式的函式體

注意事項:盡量將類的宣告和實現分離。

以下面乙個簡單的例子說明注意事項:

class

test

;class

test2

intgettestvalue()

;private

: test* ptr;};

class

test

intsquare()

intgetvalue()

void

setvalue

(int val)

private

:int value;};

int test2::gettestvalue (

)int

main()

為什麼開頭要宣告class test呢?因為test2的建構函式需要乙個test*型別的指標。開頭的宣告是為了告訴編譯器有乙個類,名字叫test,這樣編譯到test2的建構函式時,編譯器就知道有這麼回事了。

為什麼test2的成員方法getvalue要寫在類外呢?因為在這個方法中,要通過ptr訪問對應的test類的類成員方法(return (*ptr).getvalue();)。而在編譯器編譯到這裡時,編譯器只知道開頭的類宣告class test,而不知道其中細節,不知道test類中的成員變數和成員方法,因此無法以(*ptr).getvalue()的形式呼叫test類的成員方法。因此這裡只是函式宣告,實現在類外(類test2定義之後)實現。

那麼如果按下面這樣,在開頭加上宣告是不是就沒問題了呢?

int test::

getvalue()

;

很遺憾,類中的成員方法不能在類外宣告,這樣是不行的。

關於下面這兩行,為什麼是正確的呢?

int

square()

intgetvalue()

很明顯,square方法中使用了getvalue方法,而getvalue方法在其後才定義,那為什麼編譯器能識別呢?

記得類的編譯分4步:1.類名。2.成員名稱。3.成員函式的返回值和形參。4.成員函式的函式體。當編譯器編譯到square方法的函式體時,類編譯已經進行到了最後一步,這說明前三步都完成了,編譯器已經知道了test類的所有成員變數和成員方法。所以編譯到square方法的函式體時不會報錯。

換言之,類中的方法沒有規定宣告順序,可以不同在意先後順序。這與普通函式就不同,普通函式還是嚴格區分宣告和定義順序的。

C 模板類詳解及注意事項

c 中有乙個重要特性,那就是模板型別。類似於objective c中的泛型,c 通過類模板來實現泛型支援。它使用引數化的型別建立相應的函式和類,分別稱之為函式模板和類模板。模板是一種對型別進行引數化的工具,通常有兩種形式 函式模板和類模板。函式模板針對僅引數型別不同的函式 類模板針對僅資料成員和成員...

c 類的幾點注意事項

1 可變資料成員 由mutable修飾 在const函式中可以修改 class screen screen display const 2 this指標 screen screen set char c 不能從const成員函式返回指向類物件的普通引用。const成員函式只能返回 this作為乙個c...

C 中 Dictionary 的使用及注意事項

1,如果在主體 中使用,直接在初始化中生成就行 2如果在其他層,比如邏輯層,要注意在事件內部定義,在外部的話,重複呼叫就會提示 已經定義了相同的key 見例子 例子是轉的 dictionary的基本用法。假如 需求 現在要匯入一批資料,這些資料中有乙個稱為公司的字段是我們資料庫裡已經存在了的,目前我...