c 學習總結

2021-09-24 16:46:13 字數 3921 閱讀 8239

八:c++關於運算子過載知識點

1) 除了類屬關係運算子"."、成員指標運算子".*"、作用域運算子"::"、sizeof運算子和三目運算子"?:"以外,c++中的所有運算子都可以過載。

(2) 過載運算子限制在c++語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。

(3) 運算子過載實質上是函式過載,因此編譯程式對運算子過載的選擇,遵循函式過載的選擇原則。

(4) 過載之後的運算子不能改變運算子的優先順序和結合性,也不能改變運算子運算元的個數及語法結構。

(5) 運算子過載不能改變該運算子用於內部型別物件的含義。它只能和使用者自定義型別的物件一起使用,或者用於使用者自定義型別的物件和內部型別的物件混合使用時。

(6) 運算子過載是針對新型別資料的實際需要對原有運算子進行的適當的改造,過載的功能應當與原有功能相類似,避免沒有目的地使用過載運算子。 

運算子函式過載一般有兩種形式:過載為類的成員函式和過載為類的非成員函式。非成員函式通常是友元。

(可以把乙個運算子作為乙個非成員、非友元函式過載。但是,這樣的運算子函式訪問類的私有和保護成員時,

必須使用類的公有介面中提供的設定資料和讀取資料的函式,呼叫這些函式時會降低效能。可以內聯這些函式以提高效能。

運算子過載為類的成員函式的一般格式為:

《函式型別》 operator 《運算子》(《參數列》)

《函式體》

當運算子過載為類的成員函式時,函式的引數個數比原來的運算元要少乙個(後置單目運算子除外),

這是因為成員函式用this指標隱式地訪問了類的乙個物件,它充當了運算子函式最左邊的運算元。因此:

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

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

(3) 後置單目運算子過載為類的成員函式時,函式要帶有乙個整型形參。

呼叫成員函式運算子的格式如下:

《物件名》.operator 《運算子》(《引數》)

它等價於

《物件名》《運算子》《引數》

例如:a+b等價於a.operator +(b)。一般情況下,我們採用運算子的習慣表達方式。

友元函式運算子

運算子過載為類的友元函式的一般格式為:

friend 《函式型別》 operator 《運算子》(《參數列》)

《函式體》

當運算子過載為類的友元函式時,由於沒有隱含的this指標,因此運算元的個數沒有變化,

所有的運算元都必須通過函式的形參進行傳遞,函式的引數與運算元自左至右一一對應。

調用友元函式運算子的格式如下:

opeator 《運算子》(《引數1>,《引數2>)

它等價於

《引數1>《運算子》《引數2>

例如:a+b等價於operator +(a,b)。

兩種過載形式的比較

在多數情況下,將運算子過載為類的成員函式和類的友元函式都是可以的。但成員函式運算子與友元函式運算子也具有各自的一些特點:

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

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

(4) 若乙個運算子的操作需要修改物件的狀態,選擇過載為成員函式較好。

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

(6) 當運算子函式是乙個成員函式時,最左邊的運算元(或者只有最左邊的運算元)必須是運算子類的一 個類物件(或者是對該類物件的引用)。

如果左邊的運算元必須是乙個不同類的物件,或者是乙個內部 型別的物件,該運算子函式必須作為乙個友元函式來實現。

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

九:繼承和組合

一:繼承

繼承是is a 的關係,比如說student繼承person,則說明student is a person。繼承的優點是子類可以重寫父類的方法來方便地實現對父類的擴充套件。

繼承的缺點有以下幾點:

①:父類的內部細節對子類是可見的。

②:子類從父類繼承的方法在編譯時就確定下來了,所以無法在執行期間改變從父類繼承的方法的行為。

③:如果對父類的方法做了修改的話(比如增加了乙個引數),則子類的方法必須做出相應的修改。所以說子類與父類是一種高耦合,違背了物件導向思想。

二:組合

組合也就是設計類的時候把要組合的類的物件加入到該類中作為自己的成員變數。

組合的優點:

①:當前物件只能通過所包含的那個物件去呼叫其方法,所以所包含的物件的內部細節對當前物件時不可見的。

②:當前物件與包含的物件是乙個低耦合關係,如果修改包含物件的類中**不需要修改當前物件類的**。

③:當前物件可以在執行時動態的繫結所包含的物件。可以通過set方法給所包含物件賦值。

組合的缺點:①:容易產生過多的物件。②:為了能組合多個物件,必須仔細對介面進行定義。

由此可見,組合比繼承更具靈活性和穩定性,所以在設計的時候優先使用組合。只有當下列條件滿足時才考慮使用繼承:

子類是一種特殊的型別,而不只是父類的乙個角色

子類的例項不需要變成另乙個類的物件

子類擴充套件,而不是覆蓋或者使父類的功能失效

十:多型性與虛函式

一丶多型性

c++的多型性,我認為就是表達相同方法的函式在不同的類中的表現形式不同 

舉個例子,比如:移動這一行為,人是用兩條腿在走路,烏龜是慢慢爬,蛇是爬行,老虎是四條腿在走,魚是在游動……. 

這就是多型性

多型性使不同的物件但是又具有某種共同屬性的物件不但可以在一定程度上共享**,還能共享介面。

二丶虛函式

非靜態函式宣告的前面加上virtual修飾符,即可以把該函式宣告為虛函式

virtual const string name()const//函式宣告時在前面加virtual修飾符

虛函式特性:

1.虛函式可以被派生類重寫,從而提供該函式的適用於派生類的專門版本,這就表明了多型性,在不同的類中有不同的表現形式 

2.虛函式可以不重寫,這樣繼承下來的虛函式保持其在基類中的定義,即派生類和基類使用同一函式版本 

3.虛函式被重寫之後仍為虛函式,無論是否使用virtual修飾符

虛函式呼叫方式:

1.非多型呼叫 

非多型呼叫是指不借助於指標或者引用的直接呼叫,非多型呼叫總是通過成員訪問符「.」進行,與普通的成員函式呼叫類似,不具備多型特徵

2.多型呼叫 

借助於指標或者引用直接呼叫 

在c++中,乙個基類的指標或者引用可以指向他的派生類物件,而且通過這樣的指標或者引用呼叫虛函式時,呼叫的是該指標或者引用實際所指向的物件所在類的那個重寫版本。

class base//宣告基類

string base_name;//定義成員變數

public:

base()base_name("base"){}//基類建構函式,並為變數賦初值

virtual const string my_name()const//虛函式的宣告

class derived:public base//派生類宣告

string derived_name;

public:

derived():derived_name("derived"){}

const string my_name()const//重寫基類虛函式,這就表明了一種多型性

void show_ptr(base &p)

coutint main()

base bb;//基類物件

derive dd;//派生類物件

show_ptr(&bb);//基類物件的引用

show_ptr(&dd);//派生類物件的引用

return 0;

輸出結果:

base base

derived base//show_ptr引數為base類引用,但是卻返回派生類重寫的虛函式的值?

C 學習總結

using system using system.collections.generic using system.text namespace helloworld class fraction class program console.writeline sum private static...

C 學習總結( )

1 based code 是為了向後相容用的。2 mfc提供的由cdialog派生的類 derived dialog class purpose ccolordialog 選擇顏色 cfiledialog 選擇檔名以開啟或儲存 cfindreplacedialog 查詢或替換對話方塊 cfontdi...

C 學習總結

用一段 來表示的話就是這樣了 void main int date 1 while date 17 cout 第 這種教學方式,在讓自己增長知識的同時還考驗著乙個人對堅持做一件事的決心和毅力。相對於前者來說,我感覺在社會中後者的作用可能會更大吧。現在我發現部落格對我的吸引力更大了,當看到自己的十分用...