程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++運算符重載的辦法具體解析

C++運算符重載的辦法具體解析

編輯:關於C++

C++運算符重載的辦法具體解析。本站提示廣大學習愛好者:(C++運算符重載的辦法具體解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++運算符重載的辦法具體解析正文


運算符重載本質上是函數的重載

重載運算符的函數普通格局以下:

函數類型    operator  運算符稱號    (形參表列)

{對運算符的重載處置}

例如,想將“+”用於Complex(單數)的加法運算,函數的原型可所以如許的:

Complex operator + (Complex & c1,Complex &c2);

個中,operator是症結字,時刻專門用於界說重載運算符的函數的,運算符稱號就是C++供給給用戶的預定運算符。

留意:函數名是由operator和運算符構成。

下面的operator+就是函數名,意思是“對運算符+重載“。只需控制這點,這可以發明,這類函數和其他函數在情勢上沒有甚麼差別。

兩個形參是Complex類對象的援用,請求實參為Complex類對象。

在界說了重載運算符後,可以說:函數operator+重載了運算符+。

在履行單數相加的表達式c1+c2時(假定c1+c2都已被界說為Complex),體系就會挪用operator+函數,把c1+c2作為實參,與形參停止真假聯合。

為了解釋把運算符重載後,履行表達式就是挪用函數的進程,可以把兩個整數相加也想象稱為挪用上面的函數:

int operator + (int a,int b)
{
          return (a+b);
}

假如有表達式5+8,就挪用此函數,將5和8作為挪用函數時的形參,函數的前往值為13,這就是經由過程函數的辦法懂得運算符。

=====================示例代碼1.1==================================

#include<iostream>
using namespace std;
class Complex
{
 public:
  Complex()
  {
   real=0;
   imag=0;
  }
  Complex(double r,double i)
  {
   real=r;
   imag=i;
  }
  Complex operator + (Complex &c2);//聲明運算符的"+"函數
  void display();
 private:
  double real;
  double imag;
};
Complex Complex::operator+(Complex &c2)
{
 Complex c;
 c.real=real+c2.real;
 c.imag=imag+c2.imag;
 return c;
}
void Complex::display()
{
 cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
int main()
{
 Complex c1(3,4),c2(5,-10),c3;
 c3=c1+c2;
 cout<<"c1=";
 c1.display();
 cout<<"c2=";
 c2.display();
 cout<<"c3=";
 c3.display();
  return 0;
}

剖析:

在main函數中,“c3=c1+c2;”在將運算符+重載為類的成員函數後,C++編譯體系將法式中的表達式c1+c2說明為:

c1.operator+(c2);//個中c1+c2是Complex類的對象

即以c2為實參挪用c1的運算符重載函數operator+(Complex & c2),停止求值,獲得兩個單數之和。下面的“operator+”是一個函數名,它是類Complex的成員函數。

在現實任務中,類的聲明和類的應用常常是分別的。假設在聲明Complex類時,對運算符+,-,*,/都停止了重載,那末應用這個類的用戶在編程時可以完整不斟酌函數是怎樣完成的,

寧神年夜膽地直接應用+,-,*,/停止單數的運算便可,明顯非常便利。

對下面的運算符重載函數operator +還可以改寫的更簡潔一些:

Complex Complex::operator+(Complex &c2)
{
 return Complex(c2.real+real,c2.imag+imag);
}

return語句中的Complex(c2.real+real,c2.imag+imag)是樹立一個暫時對象,它沒有對象名,是一個無名對象。

在樹立暫時對象進程中,挪用結構函數。return語句將此暫時對象作為函數前往值。

那末,我們將+運算符停止了重載今後,能否將一個常量和一個單數相加呢?好比:

c3=3+c2;        //毛病,與形參類型不婚配

這是行欠亨的,由於我們界說operator +函數的時刻,形參是兩個Complex的對象,也就是說,實參和形參婚配才可以挪用函數。

應寫成對象情勢,如:

c3=Complex(3,0)+c2;     //准確,類型均為對象

還須要解釋的是:運算符被重載後,其原本的功效依然保存,沒有損失或轉變。

例如,運算符+被重載今後,依然可以用於int,float,double,char類型數據的運算,同時又增長了用於單數相加的功效。

編譯體系依據表達式的高低文,即依據運算符兩側(假如是單目運算符則為一側)的數據類型決議的。

如,關於3+5,則履行整數加法;關於3.4+5.45,則履行雙精度數加法;關於兩個單數類相加,則履行單數加法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved