《高質量 C C 程式設計指南 》閱讀筆記(三)

2021-08-06 03:17:38 字數 2410 閱讀 1047

1、對比於 c 語言的函式,c++增加了過載(overloaded)、內聯(inline)、const 和 virtual四種新機制。其中過載和內聯機制既可用於全域性函式也可用於類的成員函式,const 與virtual 機制僅用於類的成員函式。

2、以只能靠引數而不能靠返回值型別的不同來區分過載函式。編譯器根據引數為每個過載函式產生不同的內部識別符號。

3、並不是兩個函式的名字相同就能構成過載。全域性函式和類的成員函式同名不算過載,因為函式的作用域不同。

4、過載與覆蓋

成員函式被過載的特徵:

(1)相同的範圍(在同乙個類中);

(2)函式名字相同;

(3)引數不同;

(4)virtual 關鍵字可有可無。

覆蓋是指派生類函式覆蓋基類函式,特徵是:

(1)不同的範圍(分別位於派生類與基類);

(2)函式名字相同;

(3)引數相同;

(4)基類函式必須有 virtual 關鍵字。

5、本來僅僅區別過載與覆蓋並不算困難,但是 c++的隱藏規則使問題複雜性陡然增加。這裡「隱藏」是指派生類的函式遮蔽了與其同名的基類函式,規則如下:

(1)如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無 virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。

(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有 virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。

6、引數預設值只能出現在函式的宣告中,而不能出現在定義體中。、

7、在 c++語言中,可以用關鍵字 operator 加上運算子來表示函式,叫做運算子過載。

complex operator +(const complex &a, const complex &b);

8、運算子規則

所有的一元運算子 建議過載為成員函式

= () -> 只能過載為成員函式

+= -= /= *= &= |= ~= %= >>= <<= 建議過載為成員函式

所有其它運算子 建議過載為全域性函式

9、在 c++運算子集合中,有一些運算子是不允許被過載的。這種限制是出於安全方面的考慮,可防止錯誤和混亂。

(1)不能改變 c++內部資料型別(如 int,float 等)的運算子。

(2)不能過載『.』,因為『.』在類中對任何成員都有意義,已經成為標準用法。

(3)不能過載目前 c++運算子集合中沒有的符號,如#,@,$等。原因有兩點,一是難以理解,二是難以確定優先順序。

(4)對已經存在的運算子進行過載時,不能改變優先順序規則,否則將引起混亂。

10、c++ 語言支援函式內聯,其目的是為了提高函式的執行效率(速度)。

11、關鍵字 inline 必須與函式定義體放在一起才能使函式成為內聯,僅將 inline 放在函式宣告前面不起任何作用。所以說,inline 是一種「用於實現的關鍵字」,而不是一種「用於宣告的關鍵字」。

12、定義在類宣告之中的成員函式將自動地成為內聯函式。

13、內聯是以**膨脹(複製)為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。如果執行函式體內**的時間,相比於函式呼叫的開銷較大,那麼效率的收穫會很少。另一方面,每一處內聯函式的呼叫都要複製**,將使程式的總**量增大,消耗更多的記憶體空間。

1、 a(void); // 預設的無引數建構函式

a(const a &a); // 預設的拷貝建構函式

~a(void); // 預設的析構函式

a & operate =(const a &a); // 預設的賦值函式

2、 class string

; 3、建構函式與析構函式的另乙個特別之處是沒有返回值型別,這與返回值型別為 void 的函式不同。建構函式與析構函式的使命非常明確,就象出生與死亡,光

溜溜地來光溜溜地去。如果它們有返回值型別,那麼編譯器將不知所措。為了防止節外生枝,乾脆規定沒有返回值型別。

4、如果不主動編寫拷貝建構函式和賦值函式,編譯器將以「位拷貝」的方式自動生成預設的函式。倘若類中含有指標變數,那麼這兩個預設的函式就隱含了錯誤。

5、拷貝建構函式和賦值函式非常容易混淆,常導致錯寫、錯用。拷貝建構函式是在物件被建立時呼叫的,而賦值函式只能被已經存在了的物件呼叫。

string a(「hello」);

string b(「world」);

string c = a; // 呼叫了拷貝建構函式,最好寫成 c(a);

c = b; // 呼叫了賦值函式

6、基類的建構函式、析構函式、賦值函式都不能被派生類繼承。如果類之間存在繼承關係,在編寫上述基本函式時應注意以下事項:

派生類的建構函式應在其初始化表裡呼叫基類的建構函式。

基類與派生類的析構函式應該為虛(即加 virtual 關鍵字)。

高質量C C程式設計指南

1.如果引數是指標,且僅作輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改 2.在函式體的 入口處 對引數的有效性進行檢查 在函式體的 出口處 對return語句的正確性和效率進行檢查 3.引用的一些規則如下 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能...

高質量C C程式設計指南

目錄 前 言.6 第1章檔案結構 11 1.1 版權和版本的宣告 11 1.2 標頭檔案的結構 12 1.3 定義檔案的結構 13 1.4 標頭檔案的作用 13 1.5 目錄結構 14 第2章程式的版式 15 2.1 空行.15 2.2 行.16 2.3 行內的空格 17 2.4 對齊.18 2.5...

《高質量C C程式設計指南》讀書筆記三

每個類只有乙個析構函式和乙個賦值函式。可有多個建構函式。把物件的初始化放在建構函式中,把清除工作放在析構函式中。然後編譯器會自動進行初始化和清除工作。建構函式和析構函式沒有返回值型別。9.2建構函式的初始化列表 位於函式引數表之後,之前,類的const常量只能在初始化列表中初始化,9.3建構函式的次...