同様に フレンド関数を用いればクラス型のオブジェクトのメンバ変数に間接的にアクセスすることができます

クラスのメンバ変数のアクセス指定子がprivateに設定されていたならmain関数内でオブジェクトを生成したときオブジェクトのメンバ変数を直接取り扱うことはできません。 

つづき・・・


ソーラー「確かに



以下のプログラムにおいて

👇

#include <iostream>


using namespace std;


class Point{


private:

int x;

int y;



public:


void pointdisplay();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



Point operator+(Point p, Point q) {


Point a;


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

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


return a;

}


int main() {


Point p1;

p1.x = 1;

p1.y = 1;

p1.pointdisplay();


Point p2;

p2.x = 2;

p2.y = 2;

p2.pointdisplay();


Point p3;

p3=p1+p2;

//🌞p3=operator+(p1,p2);と記述してもOKです🌞


p3.pointdisplay();


return 0;

}



プログラムの実行結果


重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。


エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません

エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。


👆


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


int x;

int y;


のアクセス指定子が


privateに設定されているので


main関数内で


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

Point p1;

Point p2;



実行して


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

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


を作製しても



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

p1.x

p1.y


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

p2.x

p2.y

      直接


アクセスすることができません


ですので


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

p1.x

p1.y


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

p2.x

p2.y


数値データ

1

1


2

2

          

      直接


代入することはできません


しかし


以前にも学んだように


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

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


を通してなら


つまり


クラスPointのメンバ関数の定義内に


メンバ変数

x

y


が記述されていれば


main関数内で


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

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


を通して


      間接的に



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

p1.x

p1.y


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

p2.x

p2.y


数値データ

1

1


2

2

代入することができます。」



マックス「むむぅ、どっかで聞いたような・・・」



int(イント)「どこでだったかな?」


ソーラー「そのことを確かめるために


クラスPointのクラス宣言内で


新たに


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


public:


void pointdisplay2(int i,int j);


を記述し


その定義を


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


x = i;

y = j;


cout << x << "\n";

cout << y << "\n";


}


と設定してみます


その状態で


main関数内で


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

Point p1;

Point p2;



実行すると


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

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

(ただし、main関数内で直接用いることはできません)



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


p1.pointdisplay2(i,j);



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

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

(ただし、main関数内で直接用いることはできません)



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


p2.pointdisplay2(i,j);


が生成されることになります。


あとは

引数部分の

i

j

1

1


2

2

を代入した


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


p1.pointdisplay2(1,1);


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


p2.pointdisplay2(2,2);


を実行すれば


クラスPointのメンバ関数pointdisplay2の定義

👇


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


x = i;

y = j;


cout << x << "\n";

cout << y << "\n";

}


x

y


p1.x

p1.y


が代入された


p1.x =1;

p1.y = 1;


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

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





クラスPointのメンバ関数pointdisplay2の定義

👇


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


x = i;

y = j;


cout << x << "\n";

cout << y << "\n";

}


x

y


p2.x

p2.y


が代入された


p2.x =1;

p2.y = 1;


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

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


が実行されることになるので



       間接的に



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

p1.x

p1.y


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

p2.x

p2.y


数値データ

1

1


2

2

代入することができます。


実際にそのことをためしてみましょう😊」

👇


#include <iostream>


using namespace std;


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";

}


int main() {


Point p1;

p1.pointdisplay2(1, 1);


Point p2;

p2.pointdisplay2(2, 2);


return 0;

}



プログラムの実行結果


1

1

2

2



マックス「あっ なんか思いだした」


ソーラー「このように


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


int x;

int y;


のアクセス指定子がprivateになっていても


クラスPointのメンバ関数


void pointdisplay2(int i,int j);


のアクセス指定子がpublicとなっていれば


main関数内で


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


p1.pointdisplay2(1,1);


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


p2.pointdisplay2(2,2);


を実行することにより


           間接的に



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

p1.x

p1.y


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

p2.x

p2.y


数値データ

1

1


2

2

代入することができます。


       このように


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


int x;

int y;


のアクセス指定子をprivateに設定することにより


main関数内で


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

Point p1;

Point p2;



実行し


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

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


を生成しても



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

p1.x

p1.y


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

p2.x

p2.y

を使用できないようにし


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

p1.x

p1.y


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

p2.x

p2.y




p1.x=1;

p1.y =1;


p2.x=2;

p2.y=2;


のように




             直接


     数値データを代入できなくすることを



            カプセル化



というのでしたね💖


ですから


次のプログラムのように


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

int x;

int y;


のアクセス指定子をprivateに設定している場合は

👇


#include <iostream>


using namespace std;


class Point{


private://🌞ここです

int x;

int y;


public:


void pointdisplay();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



Point operator+(Point p, Point q) {


Point a;


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

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


return a;

}


int main() {


Point p1;

p1.x = 1;

p1.y = 1;

p1.pointdisplay();


Point p2;

p2.x = 2;

p2.y = 2;

p2.pointdisplay();


Point p3;

p3=p1+p2;

//🌞p3=operator+(p1,p2);と記述してもOKです🌞


p3.pointdisplay();


return 0;

}



ビルド実行結果


重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。


エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。


エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。


ソーラー「👆


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


Point p1;

Point p2;


を実行し


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

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


を生成しても


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

p1.x

p1.y


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

p2.x

p2.y


main関数内で使用することはできません


ですので


Point p1;

p1.x = 1;

p1.y = 1;


Point p2;

p2.x = 2;

p2.y = 2;

を実行すると

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


では


Point p1;


Point p2;


を実行した後


p1.x = 1;

p1.y = 1;



p2.x = 2;

p2.y = 2;


を実行せず


p3=p1+p2;

//🌞p3=operator+(p1,p2);と記述してもOKです🌞


だけを実行したらどうなるでしょうか?


その場合


p1+p2

つまり

operator+(p1,p2)


が実行されることになる


すなわち


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

👇

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関数内で使用することができない


クラス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

をもちいることはできないってわけだ




                       つづく・・・

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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