深入理解運算符重載

運算符重載就是函數

自定義類的 賦值運算符重載函數的作用與內置紛紛投賦值運算符的作用類似,但是要注意的是,它與 拷貝構造函數析構函數一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定默認的賦值運算符重載函數,那麼系統將會自動提供一個賦值運算符重載函數。

運算符重載的聲明方式與方法的聲明方式相同,但operator 關鍵告訴 編譯器,它實際上是一個運算符重載,後面是相關運算符的符號,在本例中就是+。返回類型是在使用這個運算符時獲得的類型。在本例中,把兩個矢量加起來會得到另一個矢量,所以返回類型就是Vector。對於這個+運算符重載,返回類型與包含類一樣,但這種情況並不是必需的。兩個參數就是要操作的對象。對於二元運算符(帶兩個參數),如+和-運算符,第一個參數是放在運算符左邊的值,第二個參數是放在運算符右邊的值。

*運算符重載:

1.運算符重載就是賦予已有的運算符多重含義,即多種功能。

2.運算符重載的目的:通過運算符的重載即重新定義使得其能夠用於特定類的對象執行特定的功能。

3.對於運算符的重載首先要關心的就是那些運算符能夠重載,那些不能重載;

能夠重載的運算符:

  (1.算術運算符:+-*/%++--

  (2)位操作運算符:&|^~<<>>

  (3)邏輯運算符:!,&&||

  (4)比較運算符:><>=<===!=

  (5)賦值運算符:=+=-=*=/=%=&=|=^=~=<<=>>=

  (6)其他運算符:[],(),->,’,newdeletenew[],delete[],->*

不能重載的運算符:

..*,::,?:

4.運算符重載後不影響其結合性和優先級,切不改變其操作數的個數及語法結構。(即運算符重載後單目運算符仍舊爲單目運算符,雙目運算符仍舊爲單目運算符)

5.重載運算符的限制條件:

   (1.不能妄造新的運算符,必須把重載運算符限制在C++語言中已有的運算符範圍內允許重載的運算符內。

   (2).重載運算符的四個“不能改變”:

       a.不能改變運算符操作數的個數;

       b.不能改變運算符原有的優先級;

       c.不能改變運算符原有的結合性;

       d.不能改變運算符原有語法結構;

6.運算符重載必須遵循的原則:

運算符重載可以使得程序更加簡潔,使表達式更加直觀,增強可讀性,但是不可過多的使用,否則會適得其反。

   (1.重載的運算符含義必須清楚:這個程序中,加法(+)運算用於Time的對象,含義不清,所以給Time類不能重載運算符+

class Time
{
public:
 Time()
  { hours = minutes = seconds = 0; }
  Time(int h, int m, int s)
  {
   hours = h; minutes = m; seconds = s;
  }
private:
 int hours, minutes, seconds;
};
Time t1(8, 10, 20), t2(9, 15, 30), t3;
     t3 = t1 + t2;

   2.重載運算符不能有二義性:

   (3)在定義運算符時必須含義準確,用法確定,不可含糊不清,在同一個地方一種重載運算符只能擁有一種理解。*運算符重載函數的兩種形式:

1.重載爲類的成員函數:

#include<iostream.h>

class complex
{
 public:
 complex()
 {
       real = image = 0;
 }
  complex(double r, double i)
 {
       real = r; image = i;
 }
 complex operator+(const complex&c);
 complex operator-(const complex&c);
 complex operator*(const complex&c);
 complex operator/(const complex&c);
 friend void printf(const complex&c);
private:
 double real, image;
};
inline complex complex::operator+(const complex& c)
{
 return complex(real + c.real, image + c.image);
}
inline complex complex::operator-(const complex&c)
{
 return complex(real - c.real, image - c.image);
}
inline complex complex::operator*(const complex&c)
{
 return complex(real*c.real - image*c.image, real*c.image + image*c.real);
}
inline complex complex::operator/(const complex&c)
{
 return complex((real*c.real + image*c.image) / (c.real*c.real+c.image*c.image),
  (image*c.real - real*c.image) / (c.real*c.real + c.image*c.image));
}




void print(const complex &c)
{
 if (c.image < 0)
  cout << c.real << c.image << 'i';
 else
  cout << c.real << '+' << c.image << 'i';
}

       . . . . . . . . . . . . . .  (主函數)


2.重載爲類的友員函數:

#include<iostream.h>

class complex
{
public:
 complex()
 {
  real = image = 0;
 }
 complex(double r, double i)
 {
  real = r; image = i;
 }
 friend complex operator+(const complex&c1,const complex&c2);
 friend complex operator-(const complex&c1, const complex&c2);
 friend complex operator*(const complex&c1,const complex&c2);
 friend complex operator/(const complex&c1,const complex&c2);
 friend void printf(const complex&c);
private:
 double real, image;
};
inline complex complex::operator+(const complex& c1,const complex&c2)
{
 return complex(c1.real + c2.real,c1.image + c2.image);
}
inline complex complex::operator-(const complex&c1,const complex&c2)
{
 return complex(c1.real - c2.real, c1.image - c2.image);
}
inline complex complex::operator*(const complex&c1,const complex&c2)
{
 return complex(c1.real*c2.real - c1.image*c2.image, c1.real*c2.image +c1.image*c2.real);
}
inline complex complex::operator/(const complex&c1,const complex&c2)
{
 return complex((c1.real*c2.real + c1.image*c2.image) / (c2.real*c2.real+c2.image*c2.image),
  (c1.image*c2.real - c1.real*c2.image) / (c2.real*c2.real + c2.image*c2.image));
}


void print(const complex &c)
{
 if (c.image < 0)
  cout << c.real << c.image << 'i';
 else
  cout << c.real << '+' << c.image << 'i';
}

        . . . . . . .  . . . 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章