Download presentation
Presentation is loading. Please wait.
1
演算子のオーバーロード
2
演算子のオーバーロード int main() { int a = 2, b = 3, c; c = a + b; // int型の足し算
MyClass h1, h2, h3; .... h3 = h1 + h2; // ??? } 自分で作成したクラスに対する演算子を新たに定義(オーバーロード)する
3
二つのint型を持つクラスの例 class coord { int main() int x, y; { public:
coord(int i, int j) {x = i; y = j;} ... }; int main() { coord o1(10,10); ... }
4
メンバ関数による代入例 int main() void coord::equal(coord ob2) { { x = ob2.x;
o3.equal(o2); ... } void coord::equal(coord ob2) { x = ob2.x; y = ob2.y; } 注意: o3.equal(o2)の実行時, x, yはo3のメンバ変数に相当 結果: o3.x = 5 o3.y = 3
5
=演算子のオーバーロード int main() coord coord::operator= (coord ob2) { {
... } coord coord::operator= (coord ob2) { x = ob2.x; y = ob2.y; return *this; } 注意: o3 = o2の実行時, x, yはo3のメンバ変数に相当 結果: o3.x = 5 o3.y = 3
6
なぜ*thisを返すのか? int main() coord coord::operator= (coord ob2) { {
... } coord coord::operator= (coord ob2) { x = ob2.x; y = ob2.y; return *this; } この時点でo3への 代入が完了している 実は戻り値の型は何でも(voidでも)実装可能で,o3には何の影響もない. しかし,*thisを返すべき理由がある.
7
なぜ*thisを返すのか? thisとは: メンバ関数を呼び出したオブジェクトのアドレス(下記の例だと,thisはo3のアドレス)
int main() { coord o1(10,10), o2(5, 3), o3; o3 = o2; } coord coord::operator= (coord ob2) { x = ob2.x; y = ob2.y; return *this; }
8
なぜ*thisを返すのか? オブジェクトを返すと,下記のコードを実行できる 戻り値がcoordでないとo3への代入がエラーになる
o2=o1の計算結果としてcoordが返され,それをo3に代入 int等の組み込み型と同じ演算規則 戻り値がcoordでないとo3への代入がエラーになる int main() { coord o1(10,10), o2, o3; o3 = o2 = o1; } coord coord::operator= (coord ob2) { x = ob2.x; y = ob2.y; return *this; }
9
メンバ関数による加算例 int main() coord coord::add(coord ob2) { { coord temp;
o3 = o1.add(o2); ... } coord coord::add(coord ob2) { coord temp; temp.x = x + ob2.x; temp.y = y + ob2.y; return temp; } 結果: o3.x = 15 o3.y = 13 注意: o1.add(o2)の実行時は x = 10, y = 10
10
+演算子のオーバーロード int main() coord coord::operator+(coord ob2) { {
o3 = o1 + o2; ... } coord coord::operator+(coord ob2) { coord temp; temp.x = x + ob2.x; temp.y = y + ob2.y; return temp; } 結果: o3.x = 15 o3.y = 13 注意: o1 + o2の実行時は x = 10, y = 10
11
重要 左のオペランド(o1+o2のo1)はいつのまにメンバ演算子関数operator+に渡されたの? ⇒暗黙のうちに渡されました
12
練習課題の注意点 coordを参考にMyStringの=と+を実装 演算子+の実装ヒント 演算子=はsetString関数を参照
MyString ret; // 1. return用のオブジェクト確保 delete[] ret.s; // 2. 一旦メンバ領域を解放 // 3. ret.sは左右のオペランド長さの和+1で領域確保 // 4. ret.sに左オペランドの文字列をコピー // 5. ret.sに右オペランドの文字列を連結 // 6. retを返す
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.