フレンド関数とフレンド演算子.

Slides:



Advertisements
Similar presentations
構造体 構造体とは? 複数のデータをパックしたもの。 新しい “ 型 “ として使用できる. 構造体 キーワード struct strcut は構造体を宣言する命令。 struct { double x,y; }a,b,c; ↑ ここまでが宣 言 ← この形式で、構造体 a,b,c, を定 義.
Advertisements

1 C++ における OOP を用いた 書き方講座 H 山崎貴英. 2 今回の内容 OOP とは? C++ の超基礎 注釈 書いてあるコードはすべて一部抜粋。 コピペだと動かないよ!
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
C++ 基礎. 目次 C++ とは? C++ におけるオブジェクト指向 課題 C++ とは? Cには足りなかったものが付与されて出来た物 具体的には、 情報の隠蔽(カプセル化) 共通の名前付け(関数のオーバーロード) 再利用の仕組み クラスの導入 など オブジェクト指向 C++ では大規模なプログラミングの.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
Javaのための暗黙的に型定義される構造体
Step-by-Step Guide on How to Start ALICE Analysis
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
社会人学習講座 「Javaプログラミング概論」
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
プログラミングII 第 7 回 オブジェクトの配列 New, delete 参照 田向.
補足説明.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
プログラミング論 関数ポインタ と 応用(qsort)
プログラミング2 関数
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
暗黙的に型付けされる構造体の Java言語への導入
関数の定義.
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
第11週:super/subクラス、継承性、メソッド再定義
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
第11回 プログラミングⅡ 第11回
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクトのプロパティ プロパティとは? あたかもそういうメンバー変数(フィールド)がそのクラスに存在するかのように見せる仕組み!
もっと詳しくArrayクラスについて調べるには → キーワード検索
一時的な型 長谷川啓
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
演習07-0 “Hello\n” “World!\n”と
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
AVL木.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
なぜ演算子をオーバーロードするの? 演算子に新しい役割をもたせたいから << 演算子 左オペランドが出力ストリーム
第5回 プログラミングⅡ 第5回
プログラミング論 構造体
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
JAVA入門⑥ クラスとインスタンス.
extern の意味 (C プログラミング演習,Visual Studio 2019 対応)
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-3. サブクラス,継承 (C++ オブジェクト指向プログラミング入門)
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
演習00-0 “Hello\n” “World!\n”と
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
演算子のオーバーロード.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
左右反転と180度回転 [0][xsize – 1] [0][0] → i ↓ j [ysize – 1][xsize – 1]
値渡しと参照渡しについて.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
C言語講座第5回 2017 構造体.
情報処理Ⅱ 第8回:2003年12月9日(火).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

フレンド関数とフレンド演算子

演算子オーバーロードの復習 左オペランドのクラスオブジェクトで+を呼び出す 左オペランドがcoordでないと呼び出せない int main() { coord o1(10,10),  o2(5, 3), o3; o3 = o1 + o2; } coord coord::operator+(coord ob2) { coord temp; temp.x = x + ob2.x; temp.y = y + ob2.y; return temp; } 左オペランド (o1)のoperator+が呼び出される 注意: x, yはo1のメンバ変数

演算子オーバーロードの復習 左右両方のオペランドがcoord: 先述の例でOK 左のみcoord: 新たにメンバ関数定義すればOK coord o1(10,10), o2(5, 3), o3; o3 = o1 + o2; coord o1(10,10), o3; int a = 3; o3 = o1 + a; coord coord::operator+(int a) { coord temp; temp.x = x + a; temp.y = y + a; return temp; }

演算子オーバーロードの復習 右のみcoord: メンバ関数として定義できない しかし,フレンド関数を利用したフレンド演算子 として定義することで計算可能 coord o1(10,10), o3; int a = 3; o3 = a + o1; エラーになる

グローバル関数とフレンド関数 グローバル関数: 特定のクラスに属さない, どこからでも呼び出せる関数.   どこからでも呼び出せる関数. フレンド関数: グローバル関数にprivateな   メンバ変数を公開する仕組み.

グローバル関数の例 class Hoge { int x; int main() { public: void set(int a); }; void Hoge::set(int a) { x = a; } int add(int a, int b) { return a + b; int main() { int a = 2, b = 3, c; c = add(a, b); } addはグローバル関数 ・クラスに属していない(Hoge::がない) ・mainやHogeクラスから呼び出し可 ・Hogeのprivateメンバにはアクセス不可

グローバル関数のNG例 class Hoge { int x; int main() { public: int a = 2, c; void set(int a); }; void Hoge::set(int a) { x = a; } int add(int a, Hoge h) { return a + h.x; int main() { int a = 2, c; Hoge h; h.set(3); c = add(a, h); } グローバル関数内ではHogeのxに アクセスできない. つまり,このコードはエラー.

フレンド関数 class Hoge { int x; public: int main() { void set(int a); friend int add(int a, Hoge h); }; void Hoge::set(int a) { x = a; } int add(int a, Hoge h) { return a + h.x; int main() { int a = 2, c; Hoge h; h.set(3); c = add(a, h); } グローバル関数のfriend宣言をする と,その関数内でprivateメンバを 公開できるようになる (このコードは実行可能)

フレンド演算子 class Hoge { int x; public: int main() { void set(int a); friend int operator+(int a, Hoge h); }; void Hoge::set(int a) { x = a; } int operator+(int a, Hoge h) { return a + h.x; int main() { int a = 2, c; Hoge h; h.set(3); c = a + h; } フレンド演算子とは, フレンド関数を利用して演算子の オーバーロードをしたもの. 左右のオペランドの型は 引数で自由に指定できる.

フレンド演算子のまとめ 左オペランドがクラスオブジェクトでない場合は,フレンド演算子で演算子オーバーロードが可能 class coord { int x, y; public: (他メンバは省略) friend coord operator+(int a, coord ob1); } coord operator+(int a, coord ob1) { coord temp; temp.x = a + ob1.x; temp.y = a + ob2.y; return temp; 左オペランドは第一, 右オペランドは第二引数 int main() { coord o1(10,10), o3; int a = 3; o3 = a + o1; } privateメンバを公開したい クラスでfriend宣言 クラスに属さない (coord::がない) friendなので x, yを使用可

練習課題の注意点 3種類の演算子+を実装する必要がある 3種類ともフレンド演算子として実装してもよい // week2の方法で引数はMyString (実装済み) s3 = s1 + s2; // week2の方法で引数はconst char * , または // フレンド演算子で引数はMyStringとconst char* s3 = s1 + “abc”; // フレンド演算子で引数はconst char*とMyString s3 = “abc” + s2; 3種類ともフレンド演算子として実装してもよい