C 類 物件知識點

2021-08-07 20:25:07 字數 4953 閱讀 7457

在類體內不允許對成員函式進行初始化。

定義類時,類的資料成員不佔記憶體空間;但是,建立類的物件時,只為每個物件分配用於儲存資料成員的記憶體,不為函式成員分配記憶體。在定義類時,不能定義該類的變數,只能定義該類型別的指標成員和該類型別的引用成員。

淺拷貝和深拷貝的區別:當類的資料成員是指標型別時,深拷貝能為新的物件分配記憶體空間(分配記憶體空間一般由new運算子實現;拷貝建構函式就是深拷貝),而淺拷貝不能。

物件指標只能訪問該類的公有資料成員和函式成員。

除非是作為函式引數與函式返回值,物件引用在定義時必須要初始化。

非靜態函式有乙個指向當前物件的this指標,而靜態函式沒有。靜態函式不屬於任何類。在組合類的建構函式中,初始化列表既不能決定是否呼叫成員物件的建構函式,也不能決定呼叫建構函式的順序,成員物件呼叫順序由成員物件定義的順序決定。

靜態變數和靜態物件都只被構造一次。

類的靜態資料成員必須進行初始化,且其初始化語句既不屬於任何類,也不屬於包括主函式在內的任何函式。

靜態變數的初值預設時為0,;動態變數的預設初值不確定。

靜態成員函式可以直接訪問類中說明的靜態成員,但不能直接訪問類中的非靜態成員。靜態資料成員不是物件成員,在引用時不需要用物件名。(?為什麼?)

不允許常物件呼叫任何類的成員函式,而且常物件一旦被定義,在其生存期內不允許改變。

只有類的常成員函式才能訪問該類的常物件;const物件不能訪問非常成員函式。常成員函式必須進行初始化,且初始化只能通過建構函式的初始化列表進行。

常成員函式的定義格式:

常成員函式不能更新類的資料成員。

保護成員具有雙重角色,對派生類的成員函式而言,它是共有成員,但對所在類之外定義的其它函式而言則是私有成員。

使用this指標返回物件則不需要呼叫建構函式,但會呼叫拷貝建構函式。先建立全域性變數,在建立區域性變數。

建構函式的呼叫條件

建立物件時;

建立動態物件(如p=new char)時;

※定義物件指標、物件引用時均沒有建立物件,所以此時不呼叫建構函式。

※陣列元素為n,定義陣列時呼叫建構函式的次數為n。

※乙個物件可以建立多個建構函式,但是只有乙個析構函式。

※建構函式沒有返回值,也不能用void修飾。

※建構函式被宣告定義為公有函式。

拷貝建構函式的呼叫條件

當用類的乙個物件去初始化該類的另乙個物件時;

如果函式的形參是類的物件,呼叫函式時,將物件作為函式實參傳遞給函式的形參;

如果函式的返回值是類的物件,函式執行完成,將返回值返回。

使用this指標返回物件。

※拷貝建構函式只能有乙個引數,並且是對某個物件的引用。

※建立物件時,建構函式和拷貝建構函式有且僅有乙個被呼叫。

※再重新定義拷貝建構函式後,預設拷貝建構函式與預設建構函式就不存在了;但是,再重新定義建構函式後,預設建構函式就不存在了,但預設拷貝建構函式還存在。

析構函式的呼叫條件:析構函式在程式結束時由系統自動呼叫。

組合物件的建構函式的呼叫順序:在定義乙個組合類的物件時,不僅他自身的建構函式將被呼叫,而且還將呼叫其成員函式的建構函式,呼叫先後順序為:

成員物件按照在其組合類的宣告中出現的次序,依次呼叫各自的建構函式,而不是按初始化列表中的順序。

組合類物件呼叫組合類建構函式。

呼叫析構函式,析構函式的呼叫順序與建構函式正好相反。

構造、拷貝以及析構函式的呼叫順序:物件被析構的順序與其建立的順序相反。

建構函式不能宣告為虛函式,析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式。

不建議在建構函式和析構函式裡面呼叫虛函式。

建構函式不能宣告為虛函式的原因是:

1 構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間確定實際型別的。而在構造乙個物件時,由於物件還未構造成功。編譯器無法知道物件 的實際型別,是該類本身,還是該類的乙個派生類,或是更深層次的派生類。無法確定。。。

2 虛函式的執行依賴於虛函式表。而虛函式表在建構函式中進行初始化工作,即初始化vptr,讓他指向正確的虛函式表。而在構造物件期間,虛函式表還沒有被初 始化,將無法進行。

虛函式的意思就是開啟動態繫結,程式會根據物件的動態型別來選擇要呼叫的方法。然而在建構函式執行的時候,這個物件的動態型別還不完整,沒有辦法確定它到底是什麼型別,故建構函式不能動態繫結。(動態繫結是根據物件的動態型別而不是函式名,在呼叫建構函式之前,這個物件根本就不存在,它怎麼動態繫結?)

1.如果幾類定義了帶形參表的建構函式時,派生類就應當定義建構函式。如果積累沒有定義建構函式,派生類也可以不定義建構函式。

2、派生類的建構函式和析構函式都不能被繼承。

3、多繼承時,對同乙個基類,不允許直接繼承兩次。

4、最遠派生類(c++將建立物件時所使用的派生類稱為最遠派生類)的建構函式要呼叫該公共基類的建構函式,而且只能被呼叫一次。

5、公共虛基類子物件只初始化一次。

6、c++規定,在初始化列表中同時出現對虛基類和非虛基類建構函式的呼叫,虛基類的建構函式優於非虛基類的建構函式的執行。

型別相容的三種情況:

1、派生類物件可以賦值給基類物件;

2、派生類物件可以初始化積累的引用;

3、派生類的位址可以賦值給指向基類的指標。

單繼承或多繼承時,派生類建構函式的呼叫順序:

1、呼叫基類的建構函式;

2、呼叫內嵌成員物件的構造函式呼叫順序按照它們在類中定義的順序;

3、派生類自己的建構函式。

單繼承時,派生類的析構建構函式的呼叫順序:

1、呼叫派生類析構函式;

2、然後呼叫派生類成員物件析構函式;

3、最後呼叫基類析構函式。

1、c++中的運算子除了「1.2.* 3::4?:5 siziof」之外,其餘全部可以被過載。

2、對於運算子過載為類的友元函式,vc++6.0不允許在宣告過載運算子之前使用using namespace std,多以分別列出對cout和endl的使用:using std::cout;using std::endl;。

3、過載為類的成員函式語法形式為:

4、過載為類的有原函式的定義格式:

5、無法宣告乙個抽象類的物件。

抽象類:

1、 帶有純虛構函式的類被稱為抽象類。純虛構函式的定義形式:

virtual 函式型別 函式名(參數列)=0;

2、 抽象類不能用作引數型別、函式返回值或強制型別轉換;

3、 可以定義乙個抽象類的指標和引用。通過抽象類的指標和引用,可以指向並訪問各派生類成員,這種訪問具有多型特徵。

成員函式運算子與友元函式運算子的特點:

1、 一般情況下,單目運算子最好過載為類的成員函式;雙目運算子最好過載為類的友元函式。

2、 一些雙目運算子不能過載為類的友元函式:=、()、[ ]、->。

3、 型別轉換函式只能定義為乙個類的成員函式而不能定義為類的友元函式。

4、 如果乙個運算子的操作需要物件的狀態,選擇過載為成員函式較好。

5、 若運算子所需的運算元(尤其是第乙個運算元)希望有隱式轉換,則只能選用友元函式。

6、 當運算子函式是乙個成員函式時,最左邊的運算元(或者只是最左邊的運算元)必須是運算子類的乙個類物件(後者是對該類物件的引用)。如果左邊的運算元必須是乙個不同的物件,或者是乙個基本資料型別的物件,該運算子函式必須作為乙個友元函式來實現。

7、 當需要重在運算子的運算具有可交換性時,選擇過載為友元函式。

運算子被過載的規則:

1、 過載後運算子的優先順序與結合性不會改變。

2、 不能改變原運算子運算元的個數。

3、 不能衝在c++中沒有的運算子。

4、 不能改變運算子的原有語義。

類的成員函式的運算子過載規則:

① 雙目運算子過載為類的成員函式時,函式只顯式說明乙個引數,該形參是運算子的右運算元。

② 前置單目運算子過載為類的成員函式時,不需要顯式說明引數,即函式沒有形參。

③ 後置單目運算子過載為類的成員函式時,為了與前置單目運算子區別,函式要帶有乙個整型形參。

類的友元函式的運算子過載規則:

1雙目運算子 b過載後,表示式oprd1 b oprd2等同於operator b(oprd1,oprd2 );

②前置單目運算子 b過載後,表示式 b oprd等同於operator b(oprd ) ;

③後置單目運算子 ++和–過載後,表示式 oprd b 等同於operator b(oprd,int )

虛函式:

1、 虛函式不能使靜態函式,也不能是友元函式。

2、 內聯函式是不能在執行中動態確定其位置的,即使虛函式在類的內部定義,編譯時,仍將其看做非內聯的。

3、 只有類的成員函式才能說明為類的虛函式;虛函式僅適合於有繼承關係的類物件。

4、 建構函式不能是虛函式,析構函式可以是虛函式,而且通常宣告為虛函式。

※動態聯編只能通過指標或引用標誌物件來操作函式。如果採用一般型別的標誌物件來操作虛函式,則將採用靜態聯編方式呼叫虛函式。

類模板定義語法:

模板類的成員函式在類外定義的語法格式:

類模板例項化、建立物件的語法形式:

※類模板的型別引數也可以採用預設值。帶預設模板引數值的類模板的預設值給出順序為從右向左,實參值結合順序為從左向右。

函式模板的定義形式:

函式顯示例項化的格式:函式名《具體函式名1, 具體函式名2,…,常量表示式》(實參表)

C 知識點 類和物件

c 知識點目錄索引 1.類和物件 2.類和物件的特點 3.具體例子 3.1 類的定義 類內定義成員函式 class person 類外定義成員函式 class person void date show 類外寫成員函式必須指明函式屬於哪乙個類域 void test 4.類的作用域 例 類的宣告 cl...

C 九 類和物件(多型)知識點

文章內容是把黑馬的課堂筆記選擇性的複製過來,便於後期學習,非原創!1 多型 多型分為兩類 靜態多型和動態多型區別 class animal class cat public animal class dog public animal 我們希望傳入什麼物件,那麼就呼叫什麼物件的函式 如果函式位址在編...

類和物件的知識點

類.dict 類的屬性字典 類.name 類的名字 字串 類.doc 類的文件字串 類.base 類的第乙個父類 類.bases 類的所有父類構成的元組 類.module 類定義所在的模組 類.class 例項對應的類 init 是類的內建函式,在例項化物件時 init 函式就會自動執行 靜態屬性 ...