C 運算子的過載

2021-08-03 13:19:57 字數 4867 閱讀 3080

c++運算子的過載總結

c++的一大特性就是過載(overload),通過過載可以把功能相似的幾個函式合為乙個,使得程式更加簡潔、高效。在c++中不止函式可以過載,運算子也可以過載。由於一般資料型別間的運算子沒有過載的必要,所以運算子過載主要是物件導向之間的。

在進行物件之間的運算時,程式會呼叫與運算子相對應的函式進行處理,所以運算子過載有兩種方式:成員函式和友元函式。成員函式的形式比較簡單,就是在類裡面定義了乙個與操作符相關的函式。友元函式因為沒有this指標,所以形參會多乙個。

class a

a operator+(a&);//成員函式

a operator-(a&);

a operator*(a&);

a operator/(a&);

a operator%(a&);

friend a operator+(a&,a&);//友元函式

friend a operator-(a&,a&);

friend a operator*(a&,a&);

friend a operator/(a&,a&);

friend a operator%(a&,a&);

private:

int data;

};

//成員函式的形式

a a::operator+(a &a)

a a::operator-(a &a)

a a::operator*(a &a)

a a::operator/(a &a)

a a::operator%(a &a)

//友元函式的形式

a operator+(a &a1,a &a2)

a operator-(a &a1,a &a2)

a operator*(a &a1,a &a2)

a operator/(a &a1,a &a2)

a operator%(a &a1,a &a2)

//然後我們就可以對類的物件進行+、-、*、/了。

void main(void)

注意:在進行a2+a3的時候會出錯,因為我們在上面對+定義了兩種方法,去掉一種即可。

因為函式體比較簡單,後面我就只給出成員函式形式的函式宣告了,關係運算子有==,!=,<,>,<=,>=。

bool operator == (const a& );

bool operator != (const a& );

bool operator < (const a& );

bool operator <= (const a& );

bool operator > (const a& );

bool operator >= (const a& );

bool operator || (const a& );

bool operator && (const a& );

bool operator ! ();

這裡的+、-是正負的意思,放在物件前面。

a& operator + ();

a& operator - ();

a* operator & ();

a& operator * ();

++和--根據位置的不同有四種情況,都可以過載。

a& operator ++ ();//前置++

a operator ++ (int);//後置++

a& operator --();//前置--

a operator -- (int);//後置--

按位操作。

a operator | (const a& );

a operator & (const a& );

a operator ^ (const a& );

a operator << (int i);

a operator >> (int i);

a operator ~ ();

沒有=哦。

a& operator += (const a& );

a& operator -= (const a& );

a& operator *= (const a& );

a& operator /= (const a& );

a& operator %= (const a& );

a& operator &= (const a& );

a& operator |= (const a& );

a& operator ^= (const a& );

a& operator <<= (int i);

a& operator >>= (int i);

void *operator new(size_t size);

void *operator new(size_t size, int i);

void *operator new(size_t size);

void operator delete(void*p);

void operator delete(void*p, int i, int j);

void operator delete (void* p);

上面的運算子過載都有兩種方式,而下面的運算子只能用一種,特殊吧。 這些運算子的過載只能是成員函式。

a& operator = (const a& );

char operator (int i);//返回值不能作為左值

const char* operator () ();

t operator -> ();

//型別轉換符

operator char* () const;

operator int ();

operator const char () const;

operator short int () const;

operator long long () const;

//還有很多就不寫了

而這些只能以友元函式的形式過載

friend inline ostream &operator << (ostream&, a&);//輸出流

friend inline istream &operator >> (istream&, a&);//輸入流

兩種過載方式的比較:

注意事項:

除了類屬關係運算子"."、成員指標運算子".*"、作用域運算子"::"、sizeof運算子和三目運算子"?:"以外,c++中的所有運算子都可以過載。

過載運算子限制在c++語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。

運算子過載實質上是函式過載,因此編譯程式對運算子過載的選擇,遵循函式過載的選擇原則。

過載之後的運算子不能改變運算子的優先順序和結合性,也不能改變運算子運算元的個數及語法結構。

運算子過載不能改變該運算子用於內部型別物件的含義。它只能和使用者自定義型別的物件一起使用,或者用於使用者自定義型別的物件和內部型別的物件混合使用時。

運算子過載是針對新型別資料的實際需要對原有運算子進行的適當的改造,過載的功能應當與原有功能相類似,避免沒有目的地使用過載運算子。

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...