博覽網 物件導向高階程式設計(上) 第一周課程筆記

2021-09-30 13:54:12 字數 2975 閱讀 3339

程式語言學習往往分為兩個部分,一是該語言的語法特性,包括關鍵字、強型別還是弱型別、是否支援指標等等;二是該語言的標準庫,包括提供的基本容器、輸入輸出方法等等。物件導向高階程式設計(上)這門課程主要是介紹第一部分的內容。

一、課程基本目標

1.以良好的方式編寫c++ class,包括以下兩種型別

• 內部無指標的class,以complex為例

• 內部有指標的class,以string為例

2.清楚class之間的關係,包括以下三種

• 繼承

• 復合

• 委託

3.推薦書目

《c++ primer》入門級的c++百科全書,介紹了c++最重要的特性

《effective c++》高階書籍,講解如何寫出高效的c++**

《c++標準庫》高階書籍,講解標準庫的使用方法

《stl原始碼解析》解析stl的源**實現,有助於讀者了解c++標準庫的底層內容

二、c++程式的基本結構

c++程式檔案一般由3部分構成,一是標頭檔案(.**件),負責c++類的宣告,二是資源檔案(.cpp檔案),負責c++函式的實現,三是標準庫檔案,為c++程式提供支援。在引入標準庫或者自己編寫的**時,c++在與c相容的同時,提供了一種新的引用方式,其**如下所示:

#include 

//c++標準庫

#include

"date.h"

//程式中的其他標頭檔案

c++程式與c語言程式最大的不同之處是引入了類(class)的概念,class與c語言中的struct相似,是一種使用者自定義型別,與struct最大的不同在於,class中可以儲存函式,並且通過關鍵字實現封裝功能,即:

class = datas + functions

三、內部無指標的class

以下內容是以乙個簡單的class——complex為例,介紹c++類的基本實現方式和需要注意的事項,部分較為簡單的內容在此處省略了源**。

1.class基本形式

class complex

complex& operator+=(const complex&); //運算子過載函式

double real() const

double imag() const

private:

double re;

double im;

}complex& complex::operator+=(const complex& x)

2.inline函式

直接在類中間寫的函式,以及在類外顯式宣告為inline的函式,會被認為是inline函式。inline函式是向編譯器的一項建議,是否真正生成inline函式取決於具體的編譯器。inline函式在呼叫時會被編譯器直接將**插入呼叫區的**段,而不是通過程式跳轉來實現相關呼叫。inline函式的優點是不需要跳轉,因為呼叫速度比一般的函式快,但是由於是直接插入**,因此生成的最終**段會變長。因此inline函式適合比較短小的且會被頻繁呼叫的函式。

3.訪問許可權

public:可以直接通過物件訪問

private:不可以直接通過物件訪問,也不可以在派生類中訪問

protected:不可以直接通過物件訪問,可以在派生類中訪問

4.建構函式

在建構函式中,可以使用初值列為類中的資料物件賦值,其效率比在函式體中賦值效率要高。(主要是減少了引數拷貝的次數)

5.函式過載

c++支援函式過載,即相同函式名的函式可以有多個,只要其引數型別或者數量不一致即可。注意,只有返回值不同的函式是不可以過載的。

函式過載在c++中是通過編譯時為函式加字首進行唯一命名實現的。

6.const

const關鍵字是c++新增的關鍵字,其作用為將變數標記為不可更改變數。被const修飾的變數在其作用範圍內是唯讀的,const關鍵字在防止函式或者變數誤操作上有十分廣泛的應用。const關鍵字也可以用來修飾類的成員函式,在修飾類的成員函式時表示該函式不會改變類內的資料的值。注意:類的常量物件智慧型呼叫類的常函式,即有const修飾的函式。因此,const關鍵字在類設計時是不可省略的。

7.傳值or傳引用

c++中增加了引用這一語法特性。引用可以看作是指向物件的乙個指標,對其的操作與對被指向的物件直接進行操作是完全一致的。在函式中,傳遞引只是傳遞乙個4位元組的指標,而傳遞物件的值則需要將物件本身進行一次拷貝,因此效率會比傳引用低。傳遞引用的語法格式如下所示:

complex& operator+=(const complex&);
由於在函式體內對引用物件的修改會同時影響到函式體外的對應物件,因此如果函式中對傳入的引入物件沒有修改,**上const修飾詞防止函式被誤用。

8.返回值or返回引用

剛才說到傳遞引用效率會比傳遞值高,所以在傳遞返回值時是否也可以傳遞引用?這個需要看情況。如果返回的是函式內部建立的臨時變數,那麼只能返回值,因為臨時變數在函式結束時會被銷毀,引用面臨空引用問題。如果返回的是從函式外部傳入的引用變數或者指標,則可以使用引用返回。

9.友元

在類中使用friend關鍵字修飾的函式或者類是該類的友元,其語法如下所示:

friend complex opertator+(complex& x, complex& y);

friend class f;

友元可以訪問類中的任何成員而不受訪問許可權的限制,是一種靈活的語法形式。但是友元會破壞資料的封裝性,因此需要謹慎使用。

10.操作符過載

操作符是一種特殊的函式,因此也是可以過載的。其過載方式有兩種,乙個是以成員函式的方式過載,乙個是以友元函式的方式過載,示例如下:

complex operator+(complex& y)

friend complex operator+(complex& x, complex& y)

注:同一類的所有物件互為友元。

C 物件導向高階程式設計(下) 第一周

你現在設計乙個物件 class a,它可不可以被轉為另外一種型別,這就是一種轉換。或者是,另外一種型別可不可以轉為a。乙個是轉出去,乙個是轉進來,這兩個方向,我們都要談。現在首先談的是轉出去 1 轉化函式不可以有引數。轉換型別而已,那有什麼引數可言。2 轉化函式沒有返回型別,返回型別就是operat...

C 物件導向高階程式設計(下) 第一周

你現在設計乙個物件 class a,它可不可以被轉為另外一種型別,這就是一種轉換。或者是,另外一種型別可不可以轉為a。乙個是轉出去,乙個是轉進來,這兩個方向,我們都要談。現在首先談的是轉出去 1 轉化函式不可以有引數。轉換型別而已,那有什麼引數可言。2 轉化函式沒有返回型別,返回型別就是operat...

博覽網 物件導向高階程式設計(上) 第三週課程筆記

第三週主要介紹c 中類與類之間的關係,主要包括復合 委託和繼承這三個基本的關係。在這三個基本關係的基礎上介紹了物件導向的程式開發方法,並且詳細講解了為物件導向程式開發方法提供基本支援的虛函式和多型特性。一 三種基本關係 1.composition 復合關係 如上述 所示,queue與deque便是乙...