C 類和物件

2021-08-03 05:35:02 字數 2973 閱讀 5927

類是建立物件的模板,乙個類可以建立多個物件,每個物件都是類型別的乙個變數;建立物件的過程也叫類的例項化。每個物件都是類的乙個具體例項(instance),擁有類的成員變數和成員函式。

與結構體一樣,類只是一種複雜資料型別的宣告,不占用記憶體空間。而物件是類這種資料型別的乙個變數,或者說是通過類這種資料型別建立出來的乙份實實在在的資料,所以占用記憶體空間。 

類的定義 

類是使用者自定義的型別,如果程式中要用到類,必須提前說明,或者使用已存在的類(別人寫好的類、標準庫中的類等),c++語法本身並不提供現成的類的名稱、結構和內容。

class是 c++ 中新增的關鍵字,專門用來定義類。student是類的名稱;類名的首字母一般大寫,以和其他的識別符號區分開。內部是類所包含的成員變數和成員函式,它們統稱為類的成員(member);由包圍起來的部分有時也稱為類體,和函式體的概念類似。 

訪問限定符:public也是 c++ 的新增關鍵字,它只能用在類的定義中,表示類的成員變數或成員函式具有「公開」的訪問許可權。 

與之對應的是private關鍵字,有「保護」許可權。 

注意在類定義的最後有乙個分號;,它是類定義的一部分,表示類定義結束了,不能省略。 

整體上講,上面的**建立了乙個 student 類,它包含了 3 個成員變數和 1 個成員函式。

類只是乙個模板(template),編譯後不占用記憶體空間,所以在定義類時不能對成員變數進行初始化,因為沒有地方儲存資料。只有在建立物件以後才會給成員變數分配記憶體,這個時候就可以賦值了。

類可以理解為一種新的資料型別,該資料型別的名稱是 student。與 char、int、float 等基本資料型別不同的是,student 是一種複雜資料型別,可以包含基本型別,而且還有很多基本型別中沒有的特性,以後大家會見到。 

物件的大小、計算

物件的大小計算依舊遵守記憶體對齊的原則 

結構體內存對其規則: 

1.第乙個成員在與結構體變數偏移量為0的位址處。 

2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。 

//對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。 

vs中預設的值為8 

gcc中的預設值為4

3.結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。 

4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體 

的對齊數)的整數倍。

空類物件(無成員變數的類)的大小也不一樣,vc中為1。 

例項化的原因(空類同樣可以被例項化),每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址,所以大小為1。 

當然在不同的編譯器上得到的結果可能不同,但是這個實驗告訴我們,不管類是否為空類,是否有成員變數,這個類在建立物件的時候都是需要分配空間的。

四個預設成員函式

1.建構函式

成員變數為私有的,要對它們進行初始化,必須用乙個公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時 

呼叫的函式稱為建構函式(constructor)。 

建構函式是特殊的成員函式,其特徵如下: 

1. 函式名與類名相同。 

2. 無返回值。 

3. 物件構造(物件例項化)時系統自動呼叫對應的建構函式。 

4. 建構函式可以過載。 

5. 建構函式可以在類中定義,也可以在類外定義。 

6. 如果類定義中沒有給出建構函式,則c++編譯器自動產生乙個預設的建構函式,但只要我們定義了乙個建構函式,系統就不會自動 

生成預設的建構函式。 

7. 無參的建構函式和全預設值的建構函式都認為是預設建構函式,並且預設的建構函式只能有乙個。 

2.拷貝建構函式 

建立物件時使用同類物件來進行初始化,這時所用的建構函式稱為拷貝建構函式(copy constructor),拷貝建構函式是特殊的構造函 

數。 特徵: 

1. 拷貝建構函式其實是乙個建構函式的過載。 

2. 拷貝建構函式的引數必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。

3. 若未顯示定義,系統會預設預設的拷貝建構函式。預設的拷貝建構函式會,依次拷貝類成員進行初始化。 

3.析構函式 

當乙個物件的生命週期結束時,c++編譯系統會自動呼叫乙個成員函式,這個特殊的成員函式即析構函式(destructor) 

建構函式是特殊的成員函式,其特徵如下: 

1. 析構函式在類名加上字元~。 

2. 析構函式無引數無返回值。 

3. 乙個類有且只有乙個析構函式。若未顯示定義,系統會自動生成預設的析構函式。 

4. 物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。 

5. 注意析構函式體內並不是刪除物件,而是做一些清理工作。 

4.賦值運算子過載 

拷貝建構函式是建立的物件,使用乙個已有物件來初始化這個準備建立的物件。 

賦值運算子的過載是對乙個已存在的物件進行拷貝賦值。

運算過載符

為了增強程式的可讀性,c++支援運算子過載。 

運算子過載特徵: 

1. operator+合法的運算子構成函式名(過載《運算子的函式名:operator<)。 

2. 過載運算子以後,不能改變運算子的優先順序/結合性/運算元個數。 

5個c++不能過載的運算子: .* /:: /sizeof /?: /.

隱含的this指標

每個成員函式都有乙個指標形參,它的名字是固定的,稱為this指標,this指標是隱式的。(建構函式比較特殊,沒有這個隱含this形參)

編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件位址作實參傳遞給成員函式的第乙個形參this指標。

this指標是成員函式隱含指標形參,是編譯器自己處理的,我們不能在成員函式的形參中新增this指標的引數定義,也不能在呼叫時顯示傳遞物件的位址給this指標。

C 類和物件 類和物件

c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...

C 物件和類

1,特殊的類 字串string include include using namespace std int main 類似於標準庫函式,我們不需要記住每種 類 的全部操作,只需要在使用過程中記住一些常用的操作就可以了。如果有需要的話,可以求助於相關書籍或網路 2,當我們對string進行種種操作...

C (類和物件)

類成員函式 類的成員函式指標那些把定義和原型寫在類定義內部的函式,就想類定義中的其他變數一樣。類訪問修飾符 類成員可以定義為public,private或protected。預設情況下是定義為private。建構函式 類的建構函式是一種特殊的函式,在建立乙個新物件是呼叫。析構函式 類的析構函式也是一...