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...