クラスのメンバ変数宣言のアクセス指定子がprivateに設定されていても自作関数をフレンド関数に設定すればそのクラス型のオブジェクトのメンバ変数に自作関数を通してアクセスすることができます

マックス「フレンド関数ぅ~~~~???」



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


そおう  ふ・れ・ん・ど 関数💖


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「ふっ


ここにきて


お友達の登場か( ^ω^)・・・



どこまで ファンタジーなんだ!?」



ソーラー「フレンド関数・・・


もう斬新すぎる・・・       」



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



普通の自作関数をフレンド関数に設定することにより



クラスのメンバ変数宣言のアクセス指定子が


        💖(⋈◍>◡<◍)。✧♡💖


           💖private💖


        💖(⋈◍>◡<◍)。✧♡💖


に設定されていても



     🌺自作関数をフレンド関数に設定していれば🌺



       そのクラスのオブジェクトのメンバ変数に



     自作関数を通してアクセスすることができるようになります



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



 マックス「うぐぅ・・・


あぐぅぅ


ど~いうことぉ?   」


ソーラー「あっ 分かった」


てんC  「私もです」 


マックス「なぁ~にぃ~」        


ソーラー「これは簡単だね


先ほどの


クラスのメンバ関数でない普通の自作関数operator+を例に説明してみるとしようかな




クラスPointのメンバ変数宣言


int x;

int y;


のアクセス指定子が


privateに設定されていると


main関数内で


クラスPoint型のオブジェクト宣言


Point p1;

Point p2;


を実行して


クラスPoint型のオブジェクトp1

クラスPoint型のオブジェクトp2


を生成しても


main関数内で


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y


を使用することはできません




             main関数内で   



クラスPointのメンバ関数でない

普通の自作関数operator+関数は普通の自作関数なので


p1+p2


つまり


operator+(p1,p2)


を実行しようとしても


すなわち


普通の自作関数operatr+関数の定義

👇

Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}

引数部分の


Point p

Point q


クラスPoint型のオブジェクト

p1

p2

が代入された


Point a;


a.x = p1.x + p2.x;

a.y = p1.y + p2.y;


return a;


を実行しようとしても


クラスPoint型のオブジェクトaのメンバ変数


a.x

a.y



クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y


を使用することはできないので


a.x

a.y


p1.x

p2.x


p1.y

p2.y



取り扱うこの命令文

👇


Point a;


a.x = p1.x + p2.x;

a.y = p1.y + p2.y;


return a;



を実行することはできません


つまり


p1+p2


すなわち


operator+(p1,p2)



を実行しようとすると


ビルドエラーが表示されることになります。


ところが


この


普通の自作関数operator+関数を


フレンド関数に設定すれば


p1+p2


すなわち


operator+(p1,p2)


を実行できる


つまり


普通の自作関数operatr+関数の定義

👇

Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}

引数部分の


Point p

Point q

クラスPoint型のオブジェクト


p1

p2

が代入された


Point a;


a.x = p1.x + p2.x;

a.y = p1.y + p2.y;


return a;


を実行できるんです。」


マックス「


クラスPointのメンバ変数宣言


int x;

int y;


のアクセス指定子が


privateに設定されているので


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y


は使用できないんじゃなかったか?」


ソーラー「つまり


クラスPointのメンバ変数宣言


int x;

int y;


のアクセス指定子が


privateに設定されていても



自作関数operator+を


フレンド関数に設定すると


使用することができないはずの


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y


 

           (´▽`*)間接的に


 


 😊フレンド関数である自作関数operator+をとおして😊


            

アクセスし


       間接的に



クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y


を取り扱い


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y




数値データを代入できるようになるというわけなんですね。


この仕組み どこかでみたような・・・


まるで


普通の自作関数operator+が


クラスPointのメンバ関数になったみたいですね


               そうだ!



クラスのメンバ関数の仕組みをおさらいしてみよう


そのために


クラスPointのクラス宣言と


そのメンバ関数の定義が次のように設定されているとします

👇


class Point{


private://🌞アクセス指定子がprivateに設定されています


int x;

int y;


public:


void pointdisplay();


public:


void pointdisplay2(int i,int j);


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";


}


void Point::pointdisplay2(int i, int j) {

x = i;

y = j;


cout << x << "\n";

cout << y << "\n";


}


👆

いかがですか?


上記のように


クラスPointのメンバ関数pointdisplay2が設定されているとします。。


このように


クラスPointのメンバ変数宣言


int x;

int y;


のアクセス指定子が


privateに


設定されている場合


main関数内で


クラスPoint型のオブジェクト宣言


Point p1;


を実行しても


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y



           直接



使用することはできません


もちろん


p1.x=1;

p1.y=1;


のようなものを実行することはできません





ですが


クラスPoint型のオブジェクトp1のメンバ関数


p1.pointdisplay2(1,1)


実行することにより


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y




      間接的に


数値データを代入することができます


つまり


クラスPoint型のオブジェクトp1のメンバ関数


p1.pointdisplay2(1,1)


実行すると



クラスPointのメンバ関数pointdisplay2(int i, int j) の定義

👇

void Point::pointdisplay2(int i, int j) {

x = i;

y = j;


cout << x << "\n";

cout << y << "\n";


}




x

y

p1.x

p1.y


int i

int j

1

1


が代入された



p1.x= 1;

p1.y =1;


cout << p1.x << "\n";

cout << p1.y << "\n";


が実行されることになります


このとき


x

y

p1.x

p1.y


を表すのでしたね


このように


クラスPoint型のオブジェクトp1のメンバ関数


p1.pointdisplay2(1,1)


実行すると


      間接的に


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


を取り扱い


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y



数値データを代入することができます








        😊💖😊お話は戻って😊💖😊




 😊フレンド関数である自作関数operator+の実行をとおして😊


           間接的に(*´▽`*)           

 

クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y


アクセスし



クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y


数値データを代入することができます



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


       そう

            

クラスPointのメンバ関数でない普通の自作関数operator+をフレンド関数に設定すると


クラスPointのメンバ変数のアクセス指定子がprivateに設定されていても


main関数内で


p1+p2


すなわち


operator+(p1,p2)


を実行できます


つまり


普通の自作関数operatr+関数の定義

👇

Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}

引数部分の


Point p

Point q

クラスPoint型のオブジェクト

p1

p2

が代入された


Point a;


a.x = p1.x + p2.x;

a.y = p1.y + p2.y;


return a;


を実行することができます



つまり


main関数内で


自作関数operatr+関数を通して



     間接的に



クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


クラスPoint型のオブジェクトp1のメンバ変数


p2.x

p12.y



を取り扱うことができるようになるんだね


どう?



     これは結構すごいことかも


なぜなら


クラスPointのメンバ関数でもない


普通の自作関数operator+をフレンド関数に設定しておけば



クラスPointのメンバ関数でない


フレンド関数である普通の自作関数operator+を通して


そのクラスPoint型のオブジェクトのメンバ変数に


アクセスしてデータを代入することができるようになるからです


普通の自作関数をフレンド関数に設定すると


クラスのメンバ変数宣言のアクセス指定子がprivateに設定されていても



クラス型のオブジェクトのメンバ変数に



          🌞自由に🌞


データが代入できるようになるので


クラスのメンバ変数宣言のアクセス指定子をprivateに設定して


クラス型のオブジェクトを作製したときに


クラス型のオブジェクトのメンバ変数に


自由にデータが代入できないように


クラス型のオブジェクトのメンバ関数を通してのみ


クラス型のオブジェクトのメンバ変数に


データを


代入することができるように制限する


カプセル化の意味が


うすれてしまうんだね


普通の自作関数operator+をフレンド関数に設定する方法は


ちょっと今やっている



        部活の後で紹介するね💖


では



         いってきま~す😊



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「ちょっ ど、どこに 行くんだ?」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る