運算子過載

2022-03-14 06:45:29 字數 4602 閱讀 9065

定義乙個過載運算子就像定義乙個函式,只是該函式的名字是operator@,這裡@代表運算子。比如返回型別 operator << (const class &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++語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。

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

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

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

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

參考:

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載

c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...