第八章 操作符過載的概念

2021-08-09 02:22:29 字數 4105 閱讀 4742

作為成員函式的操作符

operator+=需要乙個左值。需要通過現有物件(左值)來呼叫類似+=這樣的操作符,這些物件將修改左值。

●如果操作符 「+=」 必須通過現有物件來呼叫,那麼便可將該操作符實現為成員函式。通過非物件不能呼叫操作符「+=」,因為它需要修改呼叫它的物件。

● 注意: 一般而言,如果過載操作符需要乙個左值(它將修改第1個運算元),那麼, 可將其作為成員函式來實現。

這表明,只能通過現有物件呼叫這樣的操作符(作為成員函式實現的操作符)。 所有具有賦值操作符特色的其他操作符(+= -= *= /=)都可以作為成員函式來實現。

● 實現過載操作符有兩個十分重要的規則:

(1)任何不需要左值和互換的操作符,最好作為非成員函式(+ - 等)實現。 這允許編譯器在引數不匹配的情況下轉換第1個引數

(2)任何需要左值的操作符最好作為成員函式實現。 這清楚地表明只能通過現有的、可修改的物件呼叫它。

作為非成員函式實現的操作符

能以單個引數呼叫的建構函式稱為轉換建構函式。 它規定了從它的(第乙個)引數型別轉換為它的類(建構函式所屬於的類)型別。 如果轉換建構函式沒有用explicit限定符宣告, 那麼,在需要時將進行隱式轉換(使用轉換建構函式)

class x

; void f(x a){}

int main()

只有在被呼叫的函式是非成員函式時,才會轉換(由使用者單獨明確地定義)表示式的第乙個引數。被呼叫的函式是成員函式時,不轉換它的第乙個引數。● 注意: 對每個值只能進行一次轉換。 只有不存在二義性才能進行轉換。如果應用轉換引起了多個過載函式匹配,則不進行轉換,因為呼叫不夠明確。

如果未找到直接匹配的函式,無論是成員函式還是非成員函式,都將轉換(由使用者單獨明確地定義)它們的第二個引數和後續的引數。

任何不需要左值和互換的操作符,最好作為非成員函式(+ - 等)實現。 這允許編譯器在引數不匹配的情況下轉換第1個引數

● 需要左值卻不需要互換的操作(如+=、-= 等), 不用轉換第乙個引數。對於這樣的操作符,應該作為成員函式實現。

轉換建構函式

轉換建構函式的作用是將乙個其他型別的資料轉換成乙個類的物件。注意:轉換建構函式只能有乙個引數。如果有多個引數,就不是轉換建構函式。(當乙個建構函式只有乙個引數,而且該引數又不是本類的const引用時,這種建構函式稱為轉換建構函式。)

轉換建構函式的作用是將某種型別的資料轉換為類的物件。

● 下面的轉換建構函式,將int型別的r轉換為student型別的物件,物件的age為r,num為1004.

student(int r)

{ int num=1004;

int age= r;

注意 :轉換建構函式也是建構函式過載的一種,但是轉換建構函式只能有乙個引數,如果有多個引數就不是轉換建構函式。原因:如果有多個引數,無法確認把哪乙個引數注意: 如果不想讓轉換建構函式生效,也就是拒絕其它型別通過轉換建構函式轉換為本型別,可以在轉換建構函式前面加上explicit,用來抑制隱式轉換

#include 

using

namespace

std;

class complex

complex(double r,double i):real(r),imag(i) //有引數的初始化建構函式,並用初始化表進行初始化

complex(double i) //轉換建構函式,對傳入的引數進行轉換成物件

void display()

private:

double real;

double imag;

};

int main()

那麼 s1+19 呢(類物件與int直接相加)?因為我們定義了 轉換建構函式,那麼 s1+19,執行如果過程:(1)首選呼叫+號運算子,發現19不是student類的物件,而是int型別

(2)然後呼叫轉換建構函式,將19變為student(19)

(3)現在便可以進行加法運算。

轉換函式

● 用轉換建構函式可以將乙個指定型別的資料轉換為類的物件,但是不能反過來將乙個類的物件轉換為乙個其他型別的資料。型別轉換函式的作用是將乙個類的物件轉換成另乙個型別的資料。

型別轉換函式的語法格式為:

operator 型別名()

注意 :型別轉換函式在函式名前不能指定函式型別,也沒有引數返回型別是型別名決定的,只能作為成員函式,因為轉換的型別是本類的物件不能作為友元函式或者普通函式。它還可以是虛函式,還可以被繼承。對乙個值最多只能進行一次使用者定義的轉換**換建構函式或轉換函式)。

● 轉換函式不僅限於內建型別,它還可以從乙個類轉換為另乙個類

● 在類中隨意新增轉換建構函式和轉換函式不是個好習慣,因為它們同時存在可能導致二義性。

消除對臨時物件的需求

● 還有乙個需要說明的問題。通過建構函式轉換函式進行的轉換,都建立了臨時物件。 在使用轉換建構函式時,建立了臨時物件

對於每個建立的物件, 都需要呼叫建構函式和析構函式(在刪除臨時物件時)。 這極大地增加了程式的執行時間。

對於大多數從類轉換為內建型別的轉換函式,會建立乙個臨時變數(不是物件)。 建立乙個內建型別變數(如 int) 比建立乙個物件的開銷要小的多。

應該考慮盡量避免建立臨時物件的方案。注意: 在許多情況下, 避免臨時物件都是乙個好的程式設計習慣, 而不僅限於過載操作符。

從操作符函式返回結果

●左值操作符(通過現有物件呼叫的操作符) 可以返回對操作符左邊物件(操作符呼叫的目標)的引用。 這是實現左值操作符安全、高效、正確的方式

● 根據運算元計算出結果的可互換操作符(+、 - 等 ),不能返回引用或指標。 這樣的操作符要按值返回。

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

第八章 檔案操作

第八章 檔案操作 1 檔案 基於檔案描述符的i o操作是通過檔案描述符對乙個檔案執行i o操作 檔案描述符 用於描述被開啟檔案的索引值 1 檔案型別 普通檔案 文字和二進位制 目錄檔案 存放檔名及其相關資訊的檔案,是核心組織檔案系統的基本節點 裝置檔案 外部裝置看作是特殊的檔案,包括塊裝置檔案和字元...

第八章 操作字元

python中提供了幫助系統,可以通過如下指令來呼叫 字串的幫助系統 help str 列表的幫助系統 help list 方法 行為string.isupper 當且僅當字串含有至少乙個字母且所有字母為大寫時返回true string.islower 當且僅當字串含有至少乙個字母且所有字母為小寫時...