演算子のオーバーロード.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラミング基礎I(再) 山元進.
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
アルゴリズムとプログラミング (Algorithms and Programming)
情報工学演習I 第13回 C++の演習5(仮想関数).
第4回放送授業.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
ファイル操作と文字列の利用.
プログラミングII 第 7 回 オブジェクトの配列 New, delete 参照 田向.
補足説明.
第10章 char 文字列; 文字列を入力させるよ!.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
プログラミング論 関数ポインタ と 応用(qsort)
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
アルゴリズムとプログラミング (Algorithms and Programming)
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
フロントエンドとバックエンドのインターフェース
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
構造体と共用体.
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
アルゴリズムとプログラミング (Algorithms and Programming)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
C#プログラミング実習 第3回.
ポインタとポインタを用いた関数定義.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
なぜ演算子をオーバーロードするの? 演算子に新しい役割をもたせたいから << 演算子 左オペランドが出力ストリーム
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
Nakano School of Business 経営情報ビジネス科 【 Java概論(Test4)】
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-3. サブクラス,継承 (C++ オブジェクト指向プログラミング入門)
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
プログラミング 4 文字列.
Inline 展開のアルゴリズム 長谷川啓
アルゴリズムとデータ構造 2010年6月17日
フレンド関数とフレンド演算子.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
左右反転と180度回転 [0][xsize – 1] [0][0] → i ↓ j [ysize – 1][xsize – 1]
値渡しと参照渡しについて.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
第2章 数値の入力と変数 scanfと変数をやります.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

演算子のオーバーロード

演算子のオーバーロード int main() { int a = 2, b = 3, c; c = a + b; // int型の足し算 MyClass h1, h2, h3; .... h3 = h1 + h2; // ??? } 自分で作成したクラスに対する演算子を新たに定義(オーバーロード)する

二つのint型を持つクラスの例 class coord { int main() int x, y; { public: coord(int i, int j) {x = i; y = j;} ... }; int main() { coord o1(10,10); ... }

メンバ関数による代入例 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

=演算子のオーバーロード 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

なぜ*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を返すべき理由がある.

なぜ*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; }

なぜ*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; }

メンバ関数による加算例 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

+演算子のオーバーロード 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

重要 左のオペランド(o1+o2のo1)はいつのまにメンバ演算子関数operator+に渡されたの? ⇒暗黙のうちに渡されました

練習課題の注意点 coordを参考にMyStringの=と+を実装 演算子+の実装ヒント 演算子=はsetString関数を参照  MyString ret; // 1. return用のオブジェクト確保  delete[] ret.s; // 2. 一旦メンバ領域を解放 // 3. ret.sは左右のオペランド長さの和+1で領域確保 // 4. ret.sに左オペランドの文字列をコピー // 5. ret.sに右オペランドの文字列を連結 // 6. retを返す