フレンド関数 (教科書p.95〜)

初級編では、クラス内のprivateなメンバ(非公開のメンバ)にアクセスするには、メンバ関数を用意すればよいことを学びました。(忘れた人は、初級編の「クラス」の節を参照。)逆にいうと、秘密にした部分へのアクセスは、メンバ関数を利用しなければできないことになります。

オブジェクト指向設計の利点を活用するためには、privateメンバは非公開であるべきです。

しかし、左辺としてint等の組込み型を取る2項演算子や、異なるクラスの2つのオブジェクトに対しての2項演算子をオーバーロード定義する際など、演算子を定義するグルーバル関数の中でprivateメンバにアクセスしたい場合があります。

こうした要求に応えるために、C++には、関数をあるクラスのメンバにすることなく、関数からそのクラスの非公開部にアクセスする機能が用意されています。その機能がフレンド関数(friend function)です。

ここでは、フレンド関数について説明します。

解説

(1)フレンド関数の用途

繰り返しになりますが、オブジェクト指向設計の利点を活用するためには、privateメンバは非公開であるべきです。上記のような演算子を定義する目的以外には、friend機能は使うべきではない、と認識しましょう。

(2)フレンド関数の概念と具体例

課題

課題2−1

  1. 教科書p.96のサンプルプログラムを入力し、コンパイル、実行してみなさい。ただし、プロジェクト名はp3kadai2w2とし、ソースファイル名はmain.cppとする。
  2. クラス宣言部のmyclassのフレンドを宣言している行をコメントアウトしてからコンパイルすると、どのようなメッセージが出るか確かめなさい。(「privateなメンバにアクセスできない」と言われることを確認する。)
  3. メンバ変数 n が奇数かどうかを判定するフレンド関数 isOdd をプログラムに追加しなさい。isOdd が正しく動作することを確認するためのコードをメイン関数に追加しなさい
  4. メイン関数を記述したファイルmain.cppと、クラスmyclassの宣言を記述したヘッダファイルmyclass.h、フレンド関数を記述したファイルfriend.cppの3つに分け、正しくコンパイル、実行ができることを確かめなさい。2重インクルードの防止措置を施すこと。