c++支援運算子過載。運算子過載的好處是使得使用類的人更加方便。設計類的人只不過是把設計函式變成了設計運算子過載。因此,運算子過載的本質仍舊是乙個函式。
要想使用運算子過載,必須借助關鍵字operator。
c++對運算子過載是有限制的,其中: . :: ?: * sizeof 這五個運算子是不能被過載的。
運算子過載並不能改變運算子的優先順序和結合性。
運算子過載可以分為全域性過載和成員函式過載;根據運算子的目數,可以分為單目運算子過載和雙目運算子過載。
下面的**將雙目運算子過載為全域性函式。
#includeclass mycomplex
;
#include "mycomplex.h"
mycomplex::mycomplex(double x, double y):a(x),b(y)
mycomplex::mycomplex(const mycomplex& c)
double mycomplex::getimag()const
double mycomplex::getreal()const
void mycomplex::show()const
#include"mycomplex.h"
mycomplex operator+(const mycomplex& c1, const mycomplex& c2);
int main()
mycomplex operator+(const mycomplex& c1, const mycomplex& c2)
#include"mycomplex.h"
mycomplex operator+(const mycomplex& c1, const mycomplex& c2);
int main()
mycomplex operator+(const mycomplex& c1, const mycomplex& c2)
程式執行結果如下:
可以看到無論是直接使用+還是使用operator+函式來呼叫,都完成了c1和c2的相加工作。此次的運算子過載使用了類提供的介面獲取私有成員的值。更一般的做法是將全域性運算子過載宣告為類的友元函式。如下:
#includeclass mycomplex
;
這樣我們的運算子過載函式就可以訪問類的私有成員了,可以改為如下:
mycomplex operator+(const mycomplex& c1, const mycomplex& c2)
這就是友元函式經常使用的地方。
#includeclass mycomplex
;
mycomplex::mycomplex(double x, double y):a(x),b(y)
mycomplex::mycomplex(const mycomplex& c)
double mycomplex::getimag()const
double mycomplex::getreal()const
void mycomplex::show()const
mycomplex mycomplex::operator+(const mycomplex& c)
#include"mycomplex.h"
//mycomplex operator+(const mycomplex& c1, const mycomplex& c2);
int main()
//全域性雙目運算子過載
//mycomplex operator+(const mycomplex& c1, const mycomplex& c2)
//
執行結果如下:
作為成員函式過載運算子的時候,由於成員函式含有this指標。所以我們只傳遞乙個引數就夠了。
單目運算子只有乙個運算元。他的過載比較複雜。首先在類內宣告友元函式。注意必須傳遞引用才能實現單目得效果。
friend mycomplex& operator++(mycomplex& c);
然後實現如下:
mycomplex& operator++(mycomplex& c)
mycomplex& mycomplex::operator++()
後置++得函式原型和前置++不一樣,否則編譯器將認為這是乙個函式的重定義。出於這一點考慮,c++要求後置運算子過載含有乙個佔位引數。這個引數什麼用都沒有,只是為了讓編譯器確定這是後置運算子。
friend mycomplex operator++(mycomplex& c, int);
mycomplex operator++(mycomplex& c, int)
mycomplex mycomplex::operator++(int)
下面給出所有的**:
//標頭檔案
#pragma once
#includeclass mycomplex
;
#include "mycomplex.h"
mycomplex::mycomplex(double x, double y):a(x),b(y)
mycomplex::mycomplex(const mycomplex& c)
double mycomplex::getimag()const
double mycomplex::getreal()const
void mycomplex::show()const
mycomplex mycomplex::operator+(const mycomplex& c)
mycomplex& mycomplex::operator++()
mycomplex mycomplex::operator++(int)
#include"mycomplex.h"
//mycomplex operator+(const mycomplex& c1, const mycomplex& c2);
//mycomplex& operator++(mycomplex& c);
//mycomplex operator++(mycomplex& c, int);
int main()
//全域性雙目運算子過載
//mycomplex operator+(const mycomplex& c1, const mycomplex& c2)
////mycomplex& operator++(mycomplex& c)
////mycomplex operator++(mycomplex& c, int)
//
C 運算子過載之過載單目運算子
單目運算子只有乙個運算元,但是其過載方法類似於雙目運算子,在這裡以過載單目運算子 為例,介紹單目運算子的過載 注意 和 運算子有兩種使用方式,前置自增運算子和後置自增運算子,它們的作用是不一樣的,為了區分他們,c 約定,在自增 自減 運算子過載函式中,增加乙個int型別的形參,就是後置自增 自減 運...
C 之「運算子過載」
c 可以過載的運算子有 1.前置 和後置 2.前置 與後置 3.運算子 4.運算子 5.流提取與流插入 運算子 特別注意 要對類的物件使用運算子,不能過載的運算子 逗號運算子 includeusing namespace std class operate operate operate int x...
c 之運算子過載
運算子過載是一種形式的 c 多型。過載後的運算子必須至少有乙個運算元是使用者定義的型別。使用運算子時不能違反運算子原來的句法規則。不能建立新的運算子。名稱說明 sizeof sizeof 運算子 成員運算子 成員指標運算子 作用域解析運算子 條件運算子 typeid 乙個 rtti 運算子 cons...