1. 程式人生 > >C++筆記(3):運算符重載

C++筆記(3):運算符重載

存在 新的 邏輯運算符 int() 取地址 參數 spl this 函數的重載

                    運算符重載

1.運算符重載基礎

2.運算符重載的規則

3.重載雙目運算符

4.重載單目運算符

5.重載流插入和提取運算符

6.類型轉換

7.定義自己的string類

-------------------------------------------------------------------------------------------------------------------------------

1.運算符重載基礎

運算符重載就是對已有的運算符賦予新的含義,實現新的功能。
前面我們已經使用過運算符重載,如“+”,它可以對int、float、string類型進行加法運算。<<是C++中的左移運算符,但是在輸出操作中與cout配合被稱為流插入運算符,可以進行輸出。>>是右移運算符,與cin配合使用被稱為流提取運算符。
它們都被稱為運算符重載。

我們也可以根據我們的需要對C++中現有的運算符進行重載,來賦予這些運算符新的含義。如CTime類,重載+運算符,實現兩個CTime對象的相加。
介紹運算符重載前,我們看下如何來實現兩個CTime對象相加。
CTime重載+運算符實現兩個CTime對象的相加,
time1 + time2

首先需要定義一個重載的運算符函數,此後在執行被重載的運算符時,系統將自動調用該運算符函數。

運算符重載實際上是函數的重載
運算符重載的格式
返回類型 operator運算符(參數列表)
CTime operator+(CTime& time1, CTime& time2)

重載的運算符函數可以作為一般的函數,也可以作為類的成員函數
CTime operator+(CTime& time)

技術分享技術分享

-------------------------------------------------------------------------------------------------------------------------------

2.運算符重載的規則

被重載的運算符必須是已經存在的C++運算符,不能重載自己創建的運算符。
運算符被重載之後,原有功能仍然保留。只是擴展了原有功能。
重載不能改變運算符運算對象的個數。+運算符具有兩個操作數,在+運算符函數作為CTime的成員函數的時候,有一個參數是隱含的,也就是當前的對象,使用this來引用。另一個參數通過函數參數指定。
可以重載的運算符:
1.算術運算符:+,-,*,/,%,
2.邏輯運算符:&&,||,!
3.關系運算符:>,<,=,>=,<=,==,!=
4.位操作符:~,<<,>>,&,^),|
5.自增自減運算符:++,--
6.復合賦值運算符:+=,-=,*=,/=,%=
7.其他:&、*、 () 、-> 、[]、.new/delete、>>、<<

不能重載的運算符:?: . * :: sizeof


不需要重載的運算符:=(賦值)和&(取地址符)
賦值函數
普通函數和類的成員函數都可以作為類的友元,但什麽時候應該使用普通函數,什麽時候應該使用成員函數方式呢?
普通函數形式的運算符函數一般都聲明為類的友元函數,用以訪問類的私有數據成員。這樣可以減低開銷,但破壞封裝性。

因此建議盡量使用成員函數形式。

一般將單目運算符重載為成員函數,將雙目運算符重載為友元函數。
成員函數方式要求左側的參數要與類類型相同。

而普通函數則要求實參順序與形參類型順序一致。

有的運算符必須定義為類的成員函數:=、[]、()
有的運算符不能定義為類的成員函數,只能定義為類的友元:<<、>>
運算符重載可以執行任意的操作,比如可以將+定義成兩個對象相減的操作,但是這樣違背我們日常使用的習慣,容易使用誤用,減低程序可讀性,因此必須保證重載的運算符與該運算符應用於標準數據類型時所具有的功能。

-------------------------------------------------------------------------------------------------------------------------------

3.重載雙目運算符

所謂雙目運算符就是具有兩個操作數的運算符。如 +、-、==等
重載雙目運算符時,運算符函數中應該具有兩個參數,若運算符函數作為類的成員函數,則只需要一個參數。
實例
重載 == 、>、<運算符

技術分享技術分享

技術分享

-------------------------------------------------------------------------------------------------------------------------------

4.重載單目運算符

所謂單目運算符就是具有一個操作數的運算符。如 !、++、--、+=等
重載單目運算符時,運算符函數中應該具有一個參數,若運算符函數作為類的成員函數,則沒有參數。
實例
重載++、+=運算符

技術分享

-------------------------------------------------------------------------------------------------------------------------------

5.重載流插入和提取運算符

流插入運算符<<和流提取運算符>>也可以被用來重載。

可以為CTime類定義重載的流插入和流提取運算符。
重載之後就可以直接對CTime對象進行輸入和輸出:
cout<<time;
cin>>time;
前面一節我們在介紹運算符重載的規則時介紹過,重載流插入和提取運算符的運算符函數,不能作為類的成員函數,只能作為普通函數。
<<和>>重載的函數聲明如下:
istream& operator>> (istream& input, CTime& time);
ostream& operator<<(ostream& output, CTime& time);
istream和ostream分別是輸入流類和輸出流類。cin和cout就分別是istream和ostream的對象。
重載>>流提取運算符的函數第一個參數和返回類型必須是istream&類型。
重載<<流插入運算符的函數第一個參數和返回類型必須是ostream&類型。


在重載完流插入和提取運算符後,我們就可以對該類使用<<輸出數據,使用>>輸入數據。這樣是非常直觀的。
cout<<time;
operator<<(cout, time);

cin>>time;
operator>>(cin, time);

技術分享

技術分享

-------------------------------------------------------------------------------------------------------------------------------

6.類型轉換

1.使用構造函數進行類型轉換
在為CTime類重載+運算符後,我們就可以對兩個CTime對象使用+運算符進行操作。
但仍然不能使用+運算符將一個CTime對象和一個int類型相加。為了實現它,我們可以先將int類型轉換為一個CTime的臨時對象,然後在進行相加。如下:time + CTime(2)
CTime(2)這種形式很類似於強制類型轉換,將int類型轉換為CTime類型。之所以可以進行此種轉換,是因為我們已經為CTime對象定義了具有一個int類型參數的構造函數。因此具有一個參數的構造函數可以用來做類型轉換,稱之為轉換構造函數。
有了類型轉換函數,在需要CTime類型參數的地方可以使用int類型代替。
2.類型轉換函數進行類型轉換
類型轉換函數用以將類的對象轉換另一種數據類型的函數。如可以將CTime類對象轉換int類型。
int nSecond = time;
operator int()
沒有參數,沒有返回類型。


-------------------------------------------------------------------------------------------------------------------------------

7.定義自己的string類

string類使用起來比較方便,在本課程的開始我們就學習了string類。
目前為止,我們學習了如何定義類,以及如何為類定義運算符重載函數。
今天我們就來定義一個類似於string功能的自己的String類。
構造函數:
String(const char *s); //用c字符串s初始化
String(int n,char c); //用n個字符c初始化


拷貝和賦值
String& String(String& str);
const String& operator=(String& str);


析構函數
~String();

下標訪問:
char &operator[](int n);
char &at(int n)const;

String類提供的方法:
int size()const; //返回當前字符串的大小
int length()const; //返回當前字符串的長度
bool empty()const; //當前字符串是否為空

重載流插入和提取運算符:
istream& operator>>(istream& input, String& str);
ostream& operator<<(ostream& output, String& str)

連接兩個字符串:
String &operator+=(String &s);
字符串比較:
bool operator==(const String &s1,const String &s2)const;
int compare(const string &s) const;//比較當前字符串和s的大小

-------------------------------------------------------------------------------------------------------------------------------

C++筆記(3):運算符重載