プログラミング > C++ > 演算子のオーバーロードに関するメモ

演算子のオーバーロードに関するメモ


myclass + myclassのオーバーロード(二項演算子:加算)

※ 二項演算子は + のほかに - * / % & | >> << なども同様
※ (通常、戻り値は参照にしない)
+ ...
※ 通常、左側の変数も右側の変数も値を変更することは無いのでconst修飾子を付ける
  1. class MyClass
  2. {
  3. public:
  4. MyClass operator + (const MyClass& anothor) const; //クラス定義の内で宣言して、関数はクラス定義の外で定義
  5. };
  6.  
  7. MyClass MyClass::operator + (const MyClass& anothor) const {
  8. MyClass sum;
  9. sumにthisとanothorの加算結果を記録
  10. return sum;
  11. }
※ クラスでの関数の定義と同様にこうも書ける
  1. class MyClass
  2. {
  3. public:
  4. MyClass operator + (const MyClass& anothor) const { //クラス定義の内で関数も定義
  5. MyClass sum;
  6. sumにthisとanothorの加算結果を記録
  7. return sum;
  8. }
  9. };
※ 別の定義の仕方もある (グローバル関数として定義する方法)
※ こちらの場合、加算処理にpublicでないメンバにアクセスする必要があるならMyClassにfriendの宣言が必要
+ ...
  1. class MyClass
  2. {
  3. friend MyClass operator + (const MyClass& left, const MyClas& right); //publicでないメンバにアクセスが必要な場合
  4. };
  5.  
  6. MyClass operator + (const MyClass& left, const MyClass& right) { //グローバルな演算子として定義される
  7. MyClass sum;
  8. sumにleftとrightの加算結果を記録
  9. return sum;
  10. }

※ 別のクラス同士の加算も定義できる myclass + hisclass など (MyClassが演算子の左側の場合のオーバーロードになる)
※ (ただし、下記の定義をしてしまうとHisClassを返す演算はオーバーロードできなくなることに注意)
+ ...
  1. class MyClass
  2. {
  3. public:
  4. MyClass operator + (const HisClass& his) const;
  5. };
  6.  
  7. MyClass MyClass::operator + (const HisClass& his) const {
  8. MyClass sum;
  9. sumにthisとhisの加算結果を記録
  10. return sum;
  11. }
  1. class MyClass
  2. {
  3. public:
  4. MyClass operator + (const HisClass& his) const {
  5. MyClass sum;
  6. sumにthisとhisの加算結果を記録
  7. return sum;
  8. }
  9. };
  1. class MyClass
  2. {
  3. friend MyClass operator + (const MyClass& left, const HisClass& right); //publicでないメンバにアクセスが必要な場合
  4. };
  5. class HisClass
  6. {
  7. friend MyClass operator + (const MyClass& left, const HisClass& right); //publicでないメンバにアクセスが必要な場合
  8. };
  9.  
  10. MyClass operator + (const MyClass& left, const HisClass& right) {
  11. MyClass sum;
  12. sumにleftとrightの加算結果を記録
  13. return sum;
  14. }
※戻り値と計算相手は好きな型を指定できる
※(但し、オーバーロードの制約上、計算相手の型が同じものは戻り値が違うくてもオーバーロードにならない)

※ hisclass + myclassのオーバーロードは (MyClassが右側でMyClassを戻り値としたい場合)
※ (ただし、下記の定義をしてしまうとHisClassを返す演算はオーバーロードできなくなることに注意)
+ ...
  1. class HisClass
  2. {
  3. public:
  4. MyClass operator + (const MyClass& my) const;
  5. };
  6.  
  7. MyClass HisClass::operator + (const MyClass& my) const {
  8. MyClass sum;
  9. sumにthisとmyの加算結果を記録
  10. return sum;
  11. }
  1. class HisClass
  2. {
  3. public:
  4. MyClass operator + (const MyClass& my) const {
  5. MyClass sum;
  6. sumにthisとmyの加算結果を記録
  7. return sum;
  8. }
  9. };
  1. class MyClass
  2. {
  3. friend MyClass operator + (const HisClass& left, const MyClass& right); //publicでないメンバにアクセスが必要な場合
  4. };
  5. class HisClass
  6. {
  7. friend MyClass operator + (const HisClass& left, const MyClass& right); //publicでないメンバにアクセスが必要な場合
  8. };
  9.  
  10. MyClass operator + (const HisClass& left, const MyClass& right) {
  11. MyClass sum;
  12. sumにleftとrightの加算結果を記録
  13. return sum;
  14. }
※ プリミティブ型と計算したい場合も上記同様に定義できる
※ (ただし、プリミティブ型が左側の場合は当然ながらグローバル定義のみとなる)
+ ...
※ 例 myclass + 12345
  1. class MyClass
  2. {
  3. public:
  4. MyClass operator + (const int& intvalue) const;
  5. };
  6.  
  7. MyClass MyClass::operator + (const int& intvalue) const {
  8. MyClass sum;
  9. intvalueとthisの加算結果をsumに設定
  10. return sum;
  11. }
※ 例 12345 + myclass
  1. class MyClass
  2. {
  3. friend MyClass operator + (const int& intvalue, const MyClass& my);
  4. };
  5.  
  6. MyClass operator + (const int& intvalue, const MyClass& my) {
  7. MyClass sum;
  8. intvalueとmyの加算結果をsumuに設定
  9. return sum;
  10. }

++myclassのオーバーロード(前置インクリメント)

※ --myclass (前置デクリメント)も同様
※ (通常、戻り値は参照にする)
+ ...
  1. class MyClass
  2. {
  3. public:
  4. MyClass& operator ++ ();
  5. };
  6.  
  7. MyClass& MyClass::operator ++ (); {
  8. インクリメント処理
  9. return *this;
  10. }
  1. class MyClass
  2. {
  3. public:
  4. MyClass& operator ++ () {
  5. インクリメント処理
  6. return *this;
  7. }
  8. };
  1. class MyClass
  2. {
  3. friend MyClass& operator ++ (MyClass& my);
  4. };
  5.  
  6. MyClass& operator ++ (MyClass& my);
  7. myのインクリメント処理
  8. return my;
  9. }

myclass++のオーバーロード(後置インクリメント)

※ myclass-- (後置デクリメント)も同様
※ (通常、戻り値は参照にしない)
※ (仮引数のintは後置インクリメントの定義であることをコンパイラに知らせるための目印)
+ ...
  1. class MyClass
  2. {
  3. public:
  4. MyClass operator ++ (int);
  5. };
  6.  
  7. MyClass MyClass::operator ++ (int) {
  8. MyClass mycopy = this; //インクリメント前の値をコピー
  9. thisのインクリメント処理
  10. return mycopy; //コピーを返す
  11. }
  1. class MyClass
  2. {
  3. public:
  4. MyClass operator ++ (int) {
  5. MyClass mycopy = this; //インクリメント前の値をコピー
  6. thisのインクリメント処理
  7. return mycopy; //コピーを返す
  8. }
  9. };
  1. class MyClass
  2. {
  3. friend MyClass operator ++ (MyClass& my, int);
  4. };
  5.  
  6. MyClass operator ++ (MyClass& my, int) {
  7. MyClass mycopy = my; //インクリメント前の値をコピー
  8. myのインクリメント処理
  9. return mycopy; //コピーを返す
  10. }







+ ...
  1.  



.
最終更新:2013年10月22日 01:13