Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "フレンド関数とフレンド演算子."— Presentation transcript:

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

2 演算子オーバーロードの復習 左オペランドのクラスオブジェクトで+を呼び出す 左オペランドが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のメンバ変数

3 演算子オーバーロードの復習 左右両方のオペランドが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; }

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

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

6 グローバル関数の例 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メンバにはアクセス不可

7 グローバル関数の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に アクセスできない. つまり,このコードはエラー.

8 フレンド関数 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メンバを 公開できるようになる (このコードは実行可能)

9 フレンド演算子 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; } フレンド演算子とは, フレンド関数を利用して演算子の オーバーロードをしたもの. 左右のオペランドの型は 引数で自由に指定できる.

10 フレンド演算子のまとめ 左オペランドがクラスオブジェクトでない場合は,フレンド演算子で演算子オーバーロードが可能 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を使用可

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


Download ppt "フレンド関数とフレンド演算子."

Similar presentations


Ads by Google