c++類的成員變數和成員函式
類是一種資料型別,它類似於普通的資料型別,但是又有別於普通的資料型別。類這種資料型別是乙個包含成員變數和成員函式的乙個集合。
類的成員變數和普通變數一樣,也有資料型別和名稱,占用固定長度的記憶體空間。但是,在定義類的時候不能對成員變數賦值,因為類只是一種資料型別,本身不占用記憶體空間,www.cppcns.com而變數的值則需要記憶體來儲存。
類的成員函式也和普通函式一樣,都有返回值和引數列表,它與一般函式的區別是:成員函式是乙個類的成員,出現在類體中,它的作用範圍由類來決定;而普通函式是獨立的,作用範圍是全域性的,或位於某個命名空間內。
上節我們在最後的完整示例中給出了 student 類的定義,如下所示:
class student
};上面的**在類體中定義了成員函式。你也可以只在類體中宣告函式,而將函式定義放在類體外面,如下圖所示:
class student;
//函式定義
void student::say()
在類體中直接定義函式時,不需要在函式名前面加上類名,因為函式屬於哪乙個類是不言而喻的。
但當成員函式定義在類外時,就必須在函式名前面加上類名予以限定。::被稱為域解析符(也稱作用域運算子或作用域限定符),用來連線類名和函式名,指明當前函式屬於哪個類。
如果在域解析符「::」的前面沒有類名,或者函式名前面既無類名又無域解析符「::」,如:
//無類名
::say( )
//無類名也無域解析符
say( )
則表示 say() 函式不屬於任何類,這個函式不是成員函式,而是全域性函式,即非成員函式的一般普通函式。
成員函式必須先在類體中作原型宣告,然後在類外定義,也就是說類體的位置應在函式定義之前,否則編譯時會出錯。
雖然成員函式在類的外部定義,但在呼叫時會根據在類中宣告的函式原型找到函式的定義(函式**),從而執行該函式。
inline 成員函式
在類體中和類體外定義成員函式是有區別的:在類體中定義的成員函式為內聯(inline)函式,在類體外定義的不是。
內聯函式一般不是我們所期望的,它會將函式呼叫處用函式體替代,所以我建議在類體內部對成員函式作宣告,而在類體外部進行定義,這是一種良好的程式設計習慣。
當然,如果你的函式比較短小,希望定義為內聯函式,那也沒有什麼不妥的。
如果你既希望將函式定義在類體外部,又希望它是內聯函式,那麼可以在宣告函式時加 inline 關鍵字,如下所示:
class student;
//函式定義
void student::say()
這樣,say() 就會變成內聯函式。
在類體內部定義的函式也可以加 inline 關鍵字,但這是多餘的,因為類體內部定義的函式預設就是內聯函式。
值得注意的是,如果在類體外定義 inline 函式,則必須將類定義和成員函式的定義都放在同乙個標頭檔案中(或者寫在同乙個原始檔中),否則編譯時無法進行嵌入(將函式**的嵌入到函式呼叫出)。這樣做雖然提高了程式的執行效率,但從軟體工程質量的角度來看,這樣做並不是好的辦法,因此實際開發中較少在類中使用內聯函式。
c++提出內聯函式的主要用意是:用內聯函式取代帶參巨集定義(函式傳參比巨集更加方便易用),而不是提高程式執行效率,因為與執行函式花費的時間相比,呼叫函式花費的時間往往微乎其微。
c++成員函式的儲存方式
用類去定義物件時,系統會為每乙個物件分配儲存空間。如果乙個類包括了資料和函式,要分別為資料和函式的**分配儲存空間。
按理說,如果用同乙個類定義了10個物件,那麼就需要分別為10個物件的資料和函式**分配儲存單元,如下圖所示。
能否只用一段空ulbama間來存放這個共同的函式**段,在呼叫各物件的函式時,都去呼叫這個公用的函式**。如圖所示。
顯然,這樣做會大大節約儲存空間。c++編譯系統正是這樣做的,因此每個物件所占用的儲存空間只是該物件的資料部分所占用的儲存空間,而不包括函式**所占用的儲存空間。如果宣告了乙個類:
class time
};可以用下面的語句來輸出該類物件所占用的位元組數:
cout<
輸出的值是12。
這就證明了乙個物件所佔的空間大小只取決於該物件中資料成員所佔的空間,而與成員函式無關。
函式**是儲存在物件空間之外的。如果對同乙個類定義了10個物件,這些物件的成員函式對應的是同乙個函式**段,而不是10個不同的函式**段。需要注意的是,雖然呼叫不同物件的成員函式時都是執行同一段函式**,但是執行結果一般是不相同的。
不同的物件使用的是同乙個函式**段,它怎麼能夠分別對不同物件中的資料進行操作呢?
原來c++為此專門設立了乙個名為this的指標,用來指向不同的物件。需要說明:
不論成員函式在類內定義還是在類外定義,成員函式的**段都用同一種方式儲存。
不要將成員函式的這種儲存方式和inmne(內建)函式的概念混淆。不要誤以為用inline宣告(或缺省為inline)的成員函式,其**段占用物件的儲存空間,而不用 inline宣告的成員函式,其**段不占用物件的儲存空間。不論是否用inline宣告,成員函式的**段都不占用物件的儲存空間。用inline宣告的作用是在呼叫該函式時,將函式的**段複製插人到函式呼叫點,而若不用inline宣告,在呼叫該函式時,流程轉去函式**段的人口位址,在執行完該函式**段後,流程返回函式呼叫點。inline與成員函式是否占用物件的儲存空間無關,它們不屬同乙個問題,不應搞混。
應當說明,常說的「某某物件的成員函式」,是從邏輯的角度而言的,而成員函式的儲存方式,是從物理的角度而言的,二者是不矛盾的。
本文位址: /ruanjian/c/131233.html
C 類的成員變數和成員函式的問題
類是一種資料型別,該型別類似於普通的資料型別,但是又有別於普通的資料型別。類這種資料型別是乙個包含成員變數和成員函式的乙個集合。下面是student類的定義。例1 類可以包含成員變數和成員函式 class student 本例宣告了類student,並且在student類中宣告了四個成員變數 nam...
類和成員變數
類 class 是對結構體struct的增強,也是用於自定義型別。struct object class object 將關鍵字struct改為class 增加訪問修改符public 訪問修飾符 public,private,用於表示類的成員是否允許被外部訪問。public 公開的,所列的成員可被外...
類中static變數和成員變數
要理解標題,我們首先來看下static變數本身的特殊之處,即它儲存在全域性資料區。在類中的static變數也是如此。c 的記憶體分布 區 函式體的二進位制 全域性資料區 全域性變數和static變數 堆 動態記憶體分配 通過new 棧 區域性變數 常量區 字元 文字常量 這之後我們先通過 觀察一下區...