C++之运算符重载(上)
1、概念
所謂重載,就是重新賦予新的含義。函數重載就是對一個已有的函數賦予新的含義,使之實現新功能,因此,一個函數名就可以用來代表不同功能的函數,也就是”一名多用”。
運算符也可以重載。實際上,我們已經在不知不覺之中使用了運算符重載。例如,大 家都已習慣于用加法運算符”+”對整數、單精度數和雙精度數進行加法運算,如5+8, 5.8 +3.67等,其實計算機對整數、單精度數和雙精度數的加法操作過程是很不相同的, 但由于C++已經對運算符”+”進行了重載,所以就能適用于int, float, doUble類型的運算。
又如”<<“是C++的位運算中的位移運算符(左移),但在輸出操作中又是與流對 象cout 配合使用的流插入運算符,”>>“也是位移運算符(右移),但在輸入操作中又是與流對象 cin 配合使用的流提取運算符。這就是運算符重載(operator overloading)。C++系統對”<<“和”>>“進行了重載,用戶在不同的場合下使用它們時,作用是不同 的。對”<<“和”>>“的重載處理是放在頭文件stream中的。因此,如果要在程序中用”<< “和”>>”作流插入運算符和流提取運算符,必須在本文件模塊中包含頭文件stream(當然還應當包括”using namespace std“)。
現在要討論的問題是:用戶能否根據自己的需要對C++已提供的運算符進行重載,賦予它們新的含義,使之一名多用。
- 運算符重載入門技術推演
- 為什么會用運算符重載機制
用復數類舉例
- 為什么會用運算符重載機制
原因 Complex是用戶自定義類型,編譯器根本不知道如何進行加減.因此編譯器給提供了一種機制,讓用戶自己去完成,自定義類型的加減操作。這個機制就是運算符重載機制
- 運算符重載的本質是一個函數
2、限制
3、基礎
例如:
- 運算符重載的兩種方法
例如1:通過類成員函數完成-操作符重載
//函數聲明 Complex operator-(Complex &c2) //函數調用分析 //用類成員函數實現-運算符重載Complex c4 = c1 - c2;c4.printCom();//c1.operator-(c2);例如2:通過全局函數方法完成+操作符重載
//函數聲明 Complex operator+(Complex &c1, Complex &c2) //函數調用分析 int main() {Complex c1(1, 2), c2(3, 4);//Complex c31 = operator+(c1, c2); Complex c3 = c1 + c2; c3.printCom(); }
例如3
例如4
//4.1前置--操作符 成員函數實現 Complex& operator--() {this->a--;this->b--;return *this; }//4.2調用方法 --c1; c1.printCom(); //4.3前置—運算符重載函數名定義 //c1.operator–()例如5
//5.1 //后置++ 操作符 用全局函數實現 Complex operator++(Complex &c1, int) {Complex tmp = c1;c1.a++;c1.b++;return tmp; }//5.2 調用方法 c1 ++ ; //先使用 后++ //5.3 后置++運算符重載函數名定義 Complex operator++(Complex &c1, int)函數占位參數 和 前置++ 相區別
例如6
//6.1 后置— 操作符 用類成員函數實現 Complex operator--(int) {Complex tmp = *this;this->a--;this->b--;return tmp; }//6.2 調用方法 c1 ++ ; //先使用 后++ //6.3 后置–運算符重載函數名定義 Complex operator--(int) //函數占位參數 和 前置– 相區別前置和后置運算符總結
C++中通過一個占位參數來區分前置運算和后置運算
友元函數實現操作符重載的應用場景
1) 友元函數和成員函數選擇方法
- 當無法修改左操作數的類時,使用全局函數進行重載
- =, [], ()和->操作符只能通過成員函數進行重載
2)用友元函數重載<< >> 操作符 - istream 和 ostream 是 C++ 的預定義流類
- cin 是 istream 的對象,cout 是 ostream 的對象
- 運算符 << 由ostream 重載為插入操作,用于輸出基本類型數據
- 運算符 >> 由 istream 重載為提取操作,用于輸入基本類型數據
- 用友員函數重載 << 和 >> ,輸出和輸入用戶自定義的數據類型
a)用全局函數方法實現<<操作符重載
ostream& operator<<(ostream &out, Complex &c1) {//out<<"12345,生活真是苦"<<endl;out<<c1.a<<" + "<<c1.b<<"i "<<endl;return out; }/調用方法 cout<<c1; //鏈式編程支持 cout<<c1<<"abcc"; //cout.operator<<(c1).operator<<("abcd"); /函數返回值充當左值 需要返回一個引用b)類成員函數方法實現<<操作符重載
- 因無法拿到cout這個類的源碼
- cout.operator<<(c1);
友元函數重載操作符使用注意點
a)友元函數重載運算符常用于運算符的左右操作數類型不同的情況
b)其他
- 在第一個參數需要隱式轉換的情形下,使用友員函數重載運算符是正確的選擇
- 友員函數沒有 this 指針,所需操作數都必須在參數表顯式聲明,很容易實現類型的隱式轉換
- C++中不能用友員函數重載的運算符有 = () [] ->
友元函數案例vector類
#include <iostream> using namespace std;//為vector類重載流插入運算符和提取運算符 class vector { public :vector( int size =1 ) ; ~vector() ;int & operator[]( int i ) ;friend ostream & operator << ( ostream & output , vector & ) ;friend istream & operator >> ( istream & input, vector & ) ; private : int * v ; int len ; };vector::vector( int size ) { if (size <= 0 || size > 100 ){ cout << "The size of " << size << " is null !\n" ; abort() ; }v = new int[ size ] ; len = size ; }vector :: ~vector() { delete[] v ; len = 0 ; }int &vector::operator[]( int i ) { if( i >=0 && i < len ) return v[ i ] ;cout << "The subscript " << i << " is outside !\n" ; abort() ; } ostream & operator << ( ostream & output, vector & ary ) { for(int i = 0 ; i < ary.len ; i ++ ) output << ary[ i ] << " " ;output << endl ;return output ; } istream & operator >> ( istream & input, vector & ary ) { for( int i = 0 ; i < ary.len ; i ++ ) input >> ary[ i ] ;return input ; }void main() { int k ;cout << "Input the length of vector A :\n" ; cin >> k ;vector A( k ) ;cout << "Input the elements of vector A :\n" ; cin >> A ;cout << "Output the elements of vector A :\n" ;cout << A ;system("pause"); }總結
以上是生活随笔為你收集整理的C++之运算符重载(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农艺师需要职称计算机,2015年农艺师职
- 下一篇: C++之静态成员变量和静态成员函数