結論在前:
類的編譯分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的基本用法。假如 需求 現在要匯入一批資料,這些資料中有乙個稱為公司的字段是我們資料庫裡已經存在了的,目前我...