日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++之运算符重载(上)

發(fā)布時(shí)間:2023/12/19 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++之运算符重载(上) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、概念

所謂重載,就是重新賦予新的含義。函數(shù)重載就是對(duì)一個(gè)已有的函數(shù)賦予新的含義,使之實(shí)現(xiàn)新功能,因此,一個(gè)函數(shù)名就可以用來(lái)代表不同功能的函數(shù),也就是”一名多用”。

運(yùn)算符也可以重載。實(shí)際上,我們已經(jīng)在不知不覺(jué)之中使用了運(yùn)算符重載。例如,大 家都已習(xí)慣于用加法運(yùn)算符”+”對(duì)整數(shù)、單精度數(shù)和雙精度數(shù)進(jìn)行加法運(yùn)算,如5+8, 5.8 +3.67等,其實(shí)計(jì)算機(jī)對(duì)整數(shù)、單精度數(shù)和雙精度數(shù)的加法操作過(guò)程是很不相同的, 但由于C++已經(jīng)對(duì)運(yùn)算符”+”進(jìn)行了重載,所以就能適用于int, float, doUble類(lèi)型的運(yùn)算。

又如”<<“是C++的位運(yùn)算中的位移運(yùn)算符(左移),但在輸出操作中又是與流對(duì) 象cout 配合使用的流插入運(yùn)算符,”>>“也是位移運(yùn)算符(右移),但在輸入操作中又是與流對(duì)象 cin 配合使用的流提取運(yùn)算符。這就是運(yùn)算符重載(operator overloading)。C++系統(tǒng)對(duì)”<<“和”>>“進(jìn)行了重載,用戶(hù)在不同的場(chǎng)合下使用它們時(shí),作用是不同 的。對(duì)”<<“和”>>“的重載處理是放在頭文件stream中的。因此,如果要在程序中用”<< “和”>>”作流插入運(yùn)算符和流提取運(yùn)算符,必須在本文件模塊中包含頭文件stream(當(dāng)然還應(yīng)當(dāng)包括”using namespace std“)。
現(xiàn)在要討論的問(wèn)題是:用戶(hù)能否根據(jù)自己的需要對(duì)C++已提供的運(yùn)算符進(jìn)行重載,賦予它們新的含義,使之一名多用。

  • 運(yùn)算符重載入門(mén)技術(shù)推演
    • 為什么會(huì)用運(yùn)算符重載機(jī)制
      用復(fù)數(shù)類(lèi)舉例
Complex c3 = c1 + c2;

原因 Complex是用戶(hù)自定義類(lèi)型,編譯器根本不知道如何進(jìn)行加減.因此編譯器給提供了一種機(jī)制,讓用戶(hù)自己去完成,自定義類(lèi)型的加減操作。這個(gè)機(jī)制就是運(yùn)算符重載機(jī)制

  • 運(yùn)算符重載的本質(zhì)是一個(gè)函數(shù)
#include <stdio.h>// a + bi class Complex {friend Complex add (Complex &a, Complex &b);friend Complex operator+ (Complex &a, Complex &b); public:Complex(){m_a = 0;m_b = 0;}Complex (int a, int b){m_a = a;m_b = b;}void print (){printf ("%d + %di\n", m_a, m_b);}Complex operator- (Complex &b){Complex tmp(m_a-b.m_a, m_b-b.m_b);return tmp;}private:int m_a;int m_b; };// 全局函數(shù) Complex add (Complex &a, Complex &b) {Complex tmp(a.m_a+b.m_a, a.m_b+b.m_b);return tmp; }// 運(yùn)算符重載: 本質(zhì)是一個(gè)函數(shù) // 函數(shù)名字組成:operator + 要重載的運(yùn)算符 Complex operator+ (Complex &a, Complex &b) {Complex tmp(a.m_a+b.m_a, a.m_b+b.m_b);return tmp; }// 運(yùn)算符重載:給運(yùn)算符重新定義功能 // 1、寫(xiě)函數(shù)名:operator + 重載的運(yùn)算符 // 2、根據(jù)運(yùn)算需求 寫(xiě)函數(shù)的 參數(shù)列表 // 3、根據(jù)需求 寫(xiě)出函數(shù)返回值的類(lèi)型 int main() {Complex c1(1,2), c2(3,4), c3, c4;c1.print();c2.print();// c3 = c1 + c2; // Complex 自定義的類(lèi),編譯器不知道以什么規(guī)則進(jìn)行運(yùn)算// c3 = add(c1, c2);// c3 = operator+(c1, c2);c3 = c1 + c2; // ===> operator+(c1, c2);c3.print();// c4 = c3.operator-(c2); // c3 - c2c4 = c3 - c2; // ====> c4 = c3.operator-(c2)/operator-(c1, c2);// ( operator+(c1, c3) ).operator-(c2)c4 = c1 + c3 - c2;c4.print();return 0; }int mai3_1() {int a = 10, b= 20, c;c = a + b; // 基礎(chǔ)的數(shù)據(jù)做運(yùn)算,編譯器直到怎么做printf ("c = %d\n", c);return 0; }

2、限制

3、基礎(chǔ)


例如:

//全局函數(shù) 完成 +操作符 重載 Complex operator+(Complex &c1, Complex &c2) //類(lèi)成員函數(shù) 完成 -操作符 重載 Complex operator-(Complex &c2)
  • 運(yùn)算符重載的兩種方法

例如1:通過(guò)類(lèi)成員函數(shù)完成-操作符重載

//函數(shù)聲明 Complex operator-(Complex &c2) //函數(shù)調(diào)用分析 //用類(lèi)成員函數(shù)實(shí)現(xiàn)-運(yùn)算符重載Complex c4 = c1 - c2;c4.printCom();//c1.operator-(c2);

例如2:通過(guò)全局函數(shù)方法完成+操作符重載

//函數(shù)聲明 Complex operator+(Complex &c1, Complex &c2) //函數(shù)調(diào)用分析 int main() {Complex c1(1, 2), c2(3, 4);//Complex c31 = operator+(c1, c2); Complex c3 = c1 + c2; c3.printCom(); }


例如3

//前置++操作符 用全局函數(shù)實(shí)現(xiàn) Complex& operator++(Complex &c1) {c1.a ++; c1.b ++;return c1; } //調(diào)用方法 ++c1 ; //需要寫(xiě)出操作符重載函數(shù)原形 c1.printCom();//運(yùn)算符重載函數(shù)名定義 //首先承認(rèn)操作符重載是一個(gè)函數(shù) 定義函數(shù)名operator++ //分析函數(shù)參數(shù) 根據(jù)左右操作數(shù)的個(gè)數(shù),operator++(Complex &c1) //分析函數(shù)返回值Complex& operator++(Complex &c1) 返回它自身

例如4

//4.1前置--操作符 成員函數(shù)實(shí)現(xiàn) Complex& operator--() {this->a--;this->b--;return *this; }//4.2調(diào)用方法 --c1; c1.printCom(); //4.3前置—運(yùn)算符重載函數(shù)名定義 //c1.operator–()

例如5

//5.1 //后置++ 操作符 用全局函數(shù)實(shí)現(xiàn) Complex operator++(Complex &c1, int) {Complex tmp = c1;c1.a++;c1.b++;return tmp; }//5.2 調(diào)用方法 c1 ++ ; //先使用 后++ //5.3 后置++運(yùn)算符重載函數(shù)名定義 Complex operator++(Complex &c1, int)

函數(shù)占位參數(shù) 和 前置++ 相區(qū)別

例如6

//6.1 后置— 操作符 用類(lèi)成員函數(shù)實(shí)現(xiàn) Complex operator--(int) {Complex tmp = *this;this->a--;this->b--;return tmp; }//6.2 調(diào)用方法 c1 ++ ; //先使用 后++ //6.3 后置–運(yùn)算符重載函數(shù)名定義 Complex operator--(int) //函數(shù)占位參數(shù) 和 前置– 相區(qū)別

前置和后置運(yùn)算符總結(jié)
C++中通過(guò)一個(gè)占位參數(shù)來(lái)區(qū)分前置運(yùn)算和后置運(yùn)算

#include <iostream> using namespace std;class Complex { private:int a;int b;//全局函數(shù) 重載+運(yùn)算符friend Complex operator+(Complex &c1, Complex &c2);//重載 前置++friend Complex& operator++(Complex &c1);friend Complex operator++(Complex &c1, int); public:Complex(int a=0, int b=0){this->a = a;this->b = b;}void printCom(){cout<<a<<" + " << b << "i" <<endl;} public://成員函數(shù)法 實(shí)現(xiàn) -運(yùn)算符重載Complex operator-(Complex &c2){Complex tmp(this->a - c2.a, this->b - c2.b);return tmp;}//前置--Complex& operator--(){this->a --;this->b --;return *this;}//后置--Complex operator--(int){Complex tmp = *this;this->a--;this->b--;return tmp;} };//全局函數(shù)法 實(shí)現(xiàn) + 運(yùn)算符重載 Complex operator+(Complex &c1, Complex &c2) {Complex tmp(c1.a + c2.a, c1.b + c2.b);return tmp; }//前置++ Complex& operator++(Complex &c1) {c1.a++;c1.b++;return c1; }//后置++ Complex operator++(Complex &c1, int) {//先使用 在讓c1加加Complex tmp = c1;//return c1;c1.a ++;c1.b ++;return tmp; }/* 全局函數(shù)、類(lèi)成員函數(shù)方法實(shí)現(xiàn)運(yùn)算符重載步驟1)要承認(rèn)操作符重載是一個(gè)函數(shù),寫(xiě)出函數(shù)名稱(chēng)2)根據(jù)操作數(shù),寫(xiě)出函數(shù)參數(shù) 3)根據(jù)業(yè)務(wù),完善函數(shù)返回值(看函數(shù)是返回引用 還是指針 元素),及實(shí)現(xiàn)函數(shù)業(yè)務(wù) */ void main() {Complex c1(1, 2), c2(3, 4);//1 全局函數(shù)法 實(shí)現(xiàn) + 運(yùn)算符重載// Complex operator+(Complex &c1, Complex &c2);Complex c3 = c1 + c2;c3.printCom();//2 成員函數(shù) 法 實(shí)現(xiàn) -運(yùn)算符重載//c1.operator-(c2);//Complex operator-(Complex &c2)Complex c4 = c1 - c2;c4.printCom();//前置++操作符 用全局函數(shù)實(shí)現(xiàn)++c1;c1.printCom();//前置--操作符 成員函數(shù)方法--c1;c1.printCom();//Complex& operator++(Complex &c1)//c1.operator--();//后置++操作符 用全局函數(shù)實(shí)現(xiàn)c1++;c1.printCom();//后置--操作符 用成員函數(shù)實(shí)現(xiàn)c1--;c1.printCom();//c1.operator--()cout<<"hello..."<<endl;system("pause");return ; }

友元函數(shù)實(shí)現(xiàn)操作符重載的應(yīng)用場(chǎng)景
1) 友元函數(shù)和成員函數(shù)選擇方法

  • 當(dāng)無(wú)法修改左操作數(shù)的類(lèi)時(shí),使用全局函數(shù)進(jìn)行重載
  • =, [], ()和->操作符只能通過(guò)成員函數(shù)進(jìn)行重載
    2)用友元函數(shù)重載<< >> 操作符
  • istream 和 ostream 是 C++ 的預(yù)定義流類(lèi)
  • cin 是 istream 的對(duì)象,cout 是 ostream 的對(duì)象
  • 運(yùn)算符 << 由ostream 重載為插入操作,用于輸出基本類(lèi)型數(shù)據(jù)
  • 運(yùn)算符 >> 由 istream 重載為提取操作,用于輸入基本類(lèi)型數(shù)據(jù)
  • 用友員函數(shù)重載 << 和 >> ,輸出和輸入用戶(hù)自定義的數(shù)據(jù)類(lèi)型

a)用全局函數(shù)方法實(shí)現(xiàn)<<操作符重載

ostream& operator<<(ostream &out, Complex &c1) {//out<<"12345,生活真是苦"<<endl;out<<c1.a<<" + "<<c1.b<<"i "<<endl;return out; }/調(diào)用方法 cout<<c1; //鏈?zhǔn)骄幊讨С? cout<<c1<<"abcc"; //cout.operator<<(c1).operator<<("abcd"); /函數(shù)返回值充當(dāng)左值 需要返回一個(gè)引用

b)類(lèi)成員函數(shù)方法實(shí)現(xiàn)<<操作符重載

  • 因無(wú)法拿到cout這個(gè)類(lèi)的源碼
  • cout.operator<<(c1);

友元函數(shù)重載操作符使用注意點(diǎn)
a)友元函數(shù)重載運(yùn)算符常用于運(yùn)算符的左右操作數(shù)類(lèi)型不同的情況

b)其他

  • 在第一個(gè)參數(shù)需要隱式轉(zhuǎn)換的情形下,使用友員函數(shù)重載運(yùn)算符是正確的選擇
  • 友員函數(shù)沒(méi)有 this 指針,所需操作數(shù)都必須在參數(shù)表顯式聲明,很容易實(shí)現(xiàn)類(lèi)型的隱式轉(zhuǎn)換
  • C++中不能用友員函數(shù)重載的運(yùn)算符有 = () [] ->

友元函數(shù)案例vector類(lèi)

#include <iostream> using namespace std;//為vector類(lèi)重載流插入運(yùn)算符和提取運(yùn)算符 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"); }

總結(jié)

以上是生活随笔為你收集整理的C++之运算符重载(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。