過載操作符

2021-10-04 18:06:48 字數 4992 閱讀 9893

1過載算術操作符±*/

引例用乙個類fraction,用於表示2/3, 87/890這種分數。

class fraction

int num; // 分子

int den; // 分母 };

引例定義兩個數

fraction fa(2,3); // 2/3

fraction fb(3,5); // 3/5

按理來說,兩個數是可以進行算術運算的,例如

int a = 2;

int b = 3;

int c = a + b;

那麼,對於我們的「分數」這種型別,最好也能夠支援加減乘除的算術 運算。 目標效果:

fraction fc = fa + fb;

(顯然,預設情況下自己的class是不支援算術運算的)

過載算術運算子

使用過載運算子的語法,可以使得自己定義的類支援加減乘 除等算術運算子。

第一種方式: 類操作符

// 過載加號操作符

fraction operator + (const fraction& other)

過載算術運算子

其中,operator + 是要過載的操作符,形式上類似於成員函式

注意:(1)過載操作符的形式上像乙個函式,但它不是函式

(2)名稱:operator + ,這個是固定不變的

(3)返回值:型別不變,總是為該物件的型別

(4)引數:基本上也不變

(5)受public/protected/private的限制

在 fc = fa + fb 語句中,operator+被呼叫

過載算術運算子

另一種寫法:過載全域性操作符

預設地, 操作符 + 已經支援了 double + double, int + int等等,現在要求過載一下,支援 fraction + fraction

即,已經存在

int operator + (int a, int b);

double operator + (double a, double b);

現在要寫一種

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

過載算術運算子

// 過載全域性操作符

fraction operator + (const fraction& a, const fraction& b)

通常,要將全域性操作符的過載宣告為類的朋友

(當num/den為private的時候,必須將此過載的操作符宣告為friend)

注意(1)當類操作符和全域性操作符同時被過載時,類操作符被 優先呼叫。(就近原則)

(2)各種過載操作符,其形式基本是固定的。(名稱、參 數、返回值,基本上都是固定寫法)

小結

介紹了算術運算子過載的方法,給出加號(+)的示例。其 他的操作符(-, * , / )留作練習。

過載操作符的形式基本上是固定的。

(記憶為主,理解為輔,一般用不上)

2過載元素操作符 [ ]

過載操作符 [ ]

用於訪問一組元素中的乙個元素。預設地,陣列是支援 下標訪問的。

例如,int a[5] = ;

a[0] = 111; // 寫操作

int b = a[0]; // 讀操作

中的下標稱為:索引,key,唯一標誌符 其作用是用來唯一的標識乙個元素

過載操作符 [ ]

當乙個物件設計用於包含多個元素時,可以過載操作符

比如,乙個字串text,它包含了多個元素(每個元素是一 個字元)

text txt(「hello world」);

char ch = txt[0]; // 『h』

比如,在乙個datastore裡儲存多個student資料

datastore ds;

student& st = ds[「shaofa」]; // 查詢姓名為"shaofa"的記錄

過載操作符 [ ]

當乙個物件設計用於包含多個元素時,可以過載操作符

比如,乙個字串text,它包含了多個元素(每個元素是一 個字元)

text txt(「hello world」);

char ch = txt[0]; // 『h』

比如,在乙個datastore裡儲存多個student資料

datastore ds;

student& st = ds[「shaofa」]; // 查詢姓名為"shaofa"的記錄

過載操作符 [ ]

過載操作符的一般形式

element& operator (type index)

其中,(1)名字: operator,是固定不變的

(2)返回值:一般應該返回乙個子元素的引用,表示返回值 是乙個「左值」,可讀可寫

(3)引數:型別可以自己選擇,用於指定元素的下標。不一 定要使用int,使用其他型別也可以。

示例一text類用於儲存一串文字。

char& operator (int index)

示例二增強datastore類

注意(1) 操作符的返回值型別為引用,才算是符合使用慣例。 (即:應該返回乙個左值)

(2) 元素下標的型別是不一定要用int,用char*也可以

(3) 操作符是可以過載的,引數型別不同

(4) 必須考慮元素不存在的情形

3過載關係操作符==

過載關係操作符

關係操作符: <, <=, >, >=, ==, !=

預設地,編譯器不支援對自定義的類進行關係操作。例如, 我們想判斷兩個分數fraction是否相等。

fraction fa(2, 3);

fraction fb(4, 6);

if(fa == fb) // 編譯器報錯!不支援==

過載關係操作符

本ppt介紹操作符==的過載方法。

一般有兩種寫法(對比27.1裡加號的過載)

(1) 過載類操作符

class object

};(2) 過載全域性操作符

bool operator == (const object& a, const object& b )

{}過載關係操作符

以其中一種為例

bool operator == (const fraction& other)

(1)名稱 operator ==

(2)返回值: bool: true或false。(參考第3章)

(3)引數:可以過載。

例一為fraction類新增操作符==的支援,使其可以判斷相等。

**框架:

class fraction

};例二

為text類新增操作符==的支援,使其可以判斷相等。

**框架:

class text

};4過載型別轉換操作符()

型別轉換操作符

c++中允許將乙個型別轉換為另乙個型別,

例如,int a = (int) 1.23; // 將double轉成int

小括號: 型別轉換操作符,括號裡的是要轉換的目標型別

型別轉換操作符

比如,現在自己定義了乙個類fraction,表示分數。 那麼怎麼樣才可以把fraction型別直接轉成乙個double型別 呢?

fraction fa(4, 5);

double value = (double)fa;

型別轉換操作符

過載型別轉換操作符 ()

一般形式

class object

};例一

為fraction類過載乙個型別轉換操作符,使其可以被轉換為 double型別。返回值表示該分數對應的小數的值。

例二為text類過載乙個型別轉換操作符,使其可以被轉換為 const char*型字串。

小結

型別轉換操作符,形式比較簡單,直接強記就可以。

5過載輸入輸出操作符 <<

輸入輸出操作符

c++中引入操作符 >> 表示輸入, 《表示輸出

(注意:位操作裡它們承擔的意思是:左移位、右移位)

在位操作中:

unsigned int a = 0xaa << 4;

(左運算元為整型時,表示移位)

logger lg;

lg << 「hello,world」;

(左運算元為自定義物件,表示輸入輸出)

輸入輸出操作符

這裡僅演示輸出操作符 << 的用法。

定義乙個類: logger,用於輸出列印日誌。

使用方法:

// 定義乙個物件

logger lg;

lg << 1;

lg << 2.0;

lg << 「hello」;

// 或者串起來寫

lg << 1 << ", " << 2.0 << 「hello」 ;

輸入輸出操作符

一般形式:

logger& operator << (type value)

(1)名稱: operator <<

(2)返回值:左值,一般返回物件自己

(3)引數:待輸出的資料

輸入輸出操作符

在vc中的實現

輸入輸出操作符

注意:為什麼返回左值? 因為,如果不返回左值,就沒法串起來寫。

c++是借用了這兩個操作符 當左運算元為整數時,表示「移位」 當為自定義型別class時,表示「輸入、輸出」

輸入輸出操作符

引入這一節的目的:

在有些教材裡使用cin / cout來進行教學演示,本例的 目的是讓大家看清cin / cout的本來面目。

看起來比較花哨,但實用性不大。在格式化輸出方法不如 printf易用。

學習資源《c語言/c++學習指南》語法篇(從入門到精通)》

操作符過載

ifndef vertex h define vertex h class vertex vertex float px float py float pz vertex operator const vertex p vertex operator const vertex p void oper...

操作符過載

1.操作符是靜態方法,返回值表示操作結果,引數是運算元。2.操作符過載需要在過載的操作符前加上operator關鍵字。3.最好少用操作符過載,只有在意義明晰而且與內建類的操作一致時才適合使用,以免造成混亂。以建立的分數類 fraction 中的 為例,該分數類中有兩個int型的私有屬性 分子 num...

過載操作符

1.過載操作符1.1 限制過載操作符具有以下限制 1 只有c 預定義的操作符集中的操作符才可以被過載 2 對於內建型別的操作符,它的預定義不能被改變,應不能為內建型別過載操作符,如,不能改變int型的操作符 的含義 3 也不能為內建的資料型別定義其它的操作符 4 只能過載類型別或列舉型別的操作符 5...