クラス宣言内のメンバ変数宣言のアクセス指定子をprivateに設定することによりmain関数内でオブジェクトのメンバ変数に直接アクセスできないようにすることをカプセル化といいます。

マックス「


Cubeのクラス宣言内の


メンバ変数宣言

int no;

float tate;

float yoko;

float takasa;


に設定されている


アクセス指定子がprivateに設定されていても


Cubeのクラス宣言内の


メンバ関数宣言

void display(int a, float b, float c, float d);


に設定されている


アクセス指定子がpublicに設定されていれば


main関数内で


オブジェクトcube1のメンバ関数


cube1.display(5,6.0,7.0,8.0);


を実行することができ


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



数値データ

5

6.0

7.0

8.0



           間接的に


代入することができた。(#^^#)」


そのことを示すプログラムはこちらです。

👇


#include <iostream>


using namespace std;


class Cube {


private://🌞ここに注目 アクセス指定子がprivateになっています

int no;

private://🌞ここに注目 アクセス指定子がprivateになっています

float tate;

private://🌞ここに注目 アクセス指定子がprivateになっています

float yoko;

private://🌞ここに注目 アクセス指定子がprivateになっています

float takasa;

public://🌞ここに注目 アクセス指定子がpublicになっています

void display(int a, float b, float c, float d);


};

void Cube::display(int a, float b, float c, float d) {


no = a;

tate = b;

yoko = c;

takasa = d;


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


}


int main() {


Cube cube1;


cube1.display(5, 6.0, 7.0, 8.0);



return 0;


}


プログラムの実行結果


立方体につけられたナンバーは5です

立方体の縦の長さは6です

立方体の横の長さは7です

立方体の高さの長さは8です


ソーラー「このプログラムのように


Cubeのクラス宣言

👇

class Cube {


private:

int no;

private:

float tate;

private:

float yoko;

private:

float takasa;

public://🌞ここに注目 アクセス指定子がpublicになっています

void display(int a, float b, float c, float d);


};

👆


内の


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


privateに設定すると


main関数内で


オブジェクト宣言


Cube cube1;


を実行して


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


作製しても使用することはできません。


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


は使用できないので


           直接


cube1.no

cube1.tate

cube1.yoko

cube1.takasa

を用いた


cube1.no=5;

cube1.tate=6.0;

cube1.yoko=7.0;

cube1.takasa=8.0;


を実行して


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



数値データ


5

6.0

7.0

8.0


を代入することもできません。


このように


Cubeのクラス宣言内の


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


メンバ関数宣言のアクセス指定子をpublicに設定して


main関数内で


Cube cube1;


を実行することにより生成される


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



直接


数値データを代入することができないようにすることを



         🌞カプセル化🌞



といいます。



マックス「なんか 面白い仕組みになってるな


そもそもなんで


メンバ変数宣言に


アクセス指定子publicだけでなく

アクセス指定子privateが設定できることになっているのか?


アクセス指定子はpublicだけあればいいんじゃないか~


いや


そもそも


privateもpublicもなくてもいいんじゃないか?


にゃ~


ぶーにゃんよ」


ぶーにゃん「にゃ~あん💖💖💖」


ソーラー「


クラス宣言は作製したら


ファイルに保存しておくことができます。


そのクラス宣言が保存されている


ファイルを


他の人に渡してあげたなら


他の人も


そのクラス宣言を利用することができるようになります。


ところで


ある人が実際に


すべての

メンバ変数宣言

メンバ関数宣言

のアクセス指定子がpublicに設定された


Cubeのクラス宣言


が保存されているデータを


渡されたとします。


そのとき


Cubeのクラス宣言のデータを


           渡した側の人は


           渡された側の人に


オブジェクト宣言


Cube cube1;


を実行して


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


を作製した場合


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


に代入されるのは


立方体cube1の


ナンバー

高さ


の数値データを想定していて


さらに


立方体cube1の


ナンバー

高さ


の数値データ


は常に


0以上の数値であると想定しており


オブジェクトのメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


に代入されるのは


常に


0以上の数値データであると考えていると



          😊伝えた😊


とします。」


マックス「まあ


立方体cube1の


ナンバー

高さ


の数値データが


マイナスの数値データになることはないよな


そ~言う設定になると伝えることになるだろう」


ソーラー「ですが


Cubeのクラス宣言を


渡された方は


そのことを聞いてはいたのですが


          (´▽`*)すっかり忘れていて


次のようなプログラムを作製したとします

👇

#include <iostream>


using namespace std;


class Cube {


public:

int no;

public:

float tate;

public:

float yoko;

public:

float takasa;

public://🌞ここに注目 アクセス指定子がpublicになっています

void display(int a, float b, float c, float d);


};

void Cube::display(int a, float b, float c, float d) {


no = a;

tate = b;

yoko = c;

takasa = d;


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


}


int main() {


Cube cube1;


cube1.no = -1;

cube1.tate = -5.0;

cube1.yoko = -10.0;

cube1.takasa = -122.5;


cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";

cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";

cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";

cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";


return 0;


}


プログラムの実行結果


立方体につけられたナンバーは-1です

立方体の縦の長さは-5です

立方体の横の長さは-10.0です

立方体の高さの長さは-122.5です


マックス「


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



もろに


cube1.no=-1;

cube1.tate=-5.0;

cube1.yoko=-10.0;

cube1.takasa=-122.5;


マイナス数値データが代入されているぞ」


ソーラー「さらに


データを渡されたこの方は


cube1.no=-1;

cube1.tate=-5.0;

cube1.yoko=-10.0;

cube1.takasa=-122.5;


が実行されて


マイナスデータが代入された


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



立方体cube1の3D画像😊を作製するソフトにかけたため


立方体cube1の3D画像がバグりました


そのような事態がおこることも考えられるわけです。」


マックス「確かに自分以外の人に


クラスのデータを渡すと


そのクラスを自分がおもっているように相手はつかわないことも考えられるな・・・」



ソーラー「そのようなことを防ぐために


Cubeのクラス宣言で


メンバ変数宣言

int no;

float tate;

float yoko;

float takasa;

のアクセス指定子を

privateに


メンバ関数宣言

void display(int a, float b, float c, float d);

のアクセス指定子を

publicに


指定するんです。」


マックス「?


そ~すると


Cubeのクラス宣言を


渡された側の人は


オブジェクト宣言


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


Cube cube1;


を実行して


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


を作製しても使用することはできないため


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


数値データを


代入することができなくなってしまうんじゃないか?」


ソーラー「そうなんです\(^o^)/


main関数内で


オブジェクト宣言


Cube cube1;


を実行しても


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


int no;

float tate;

float yoko;

float takasa;


のアクセス指定子が


privateに指定されているため


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


は生成されていても使用できなくなっているので


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


には


負の数どころか

正の数も


なにも


代入することもできなくなっているんです。\(^o^)/


やったね


          🌞カプセル化🌞



ばんざ~い


めでたし😊 めでたし😊」


マックス「おぉぉぉぉ


すんごぉぉぉぉぉぃ~~~~~~


やったね


ソーラー(^_^)/



ってか


なんだ


そりゃ もうもろ アウトだろぉぉぉ~~~~~


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa

に負の数を代入されないようにするために


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が使用されないようにするとは


いったいど~いう対処方法なんだ?


それだと


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


に数値データを代入するという基本的なことすらできないじゃないか


それだと


Cubeのクラス宣言を


相手に


渡す意味すらないじゃないか~~~い」


ソーラー「ここで


Cubeのクラス宣言内で


メンバ変数宣言

int no;

float tate;

float yoko;

float takasa;

のアクセス指定子を


privateに


メンバ関数宣言

void display(int a, float b, float c, float d);

のアクセス指定子を


publicに


指定していたことが生きてくるんです」


マックス「にゃ にゃんで?」


ソーラー「今まで見てきたように


Cubeのクラス宣言内で


メンバ変数宣言

int no;

float tate;

float yoko;

float takasa;

のアクセス指定子を


privateに


メンバ関数宣言

void display(int a, float b, float c, float d);

のアクセス指定子を


publicに


指定していれば


main関数内で


オブジェクト宣言


Cube cube1;


を実行して


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


を生成しても使用することはできなくなりますが


オブジェクトcube1のメンバ関数


cube1.display(5,6.0,7.0,8.0);


を実行して


間接的に


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



数値データ

5

6.0

7.0

8.0

代入することはできました。


このように


オブジェクトcube1のメンバ関数


を用いて


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


         間接的に


数値データ



代入できるということを利用して


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa

負の数が代入されないようにすることができるんです。



そのためには


クラスCubeのメンバ関数displayの定義を


void Cube::display(int a, float b, float c, float d) {


no = a;

tate = b;

yoko = c;

takasa = d;


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";

}


から


void Cube::display(int a, float b, float c, float d) {


if(a>=0&&b>=0&&c>=0&&d>=0){


no = a;

tate = b;

yoko = c;

takasa = d;


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";

}

else

cout <<"オブジェクトのメンバ変数にマイナスのデータが入力されています" << "\n";

}


に変更してしまえばいいんです。


クラスCubeのメンバ関数displayの定義がこのように定義されていれば


オブジェクトcube1のメンバ関数


cube1.display(int a, float b, float c, float d);


が実行されるとき


int a

float b

float c

float d

に代入される数値データが


0以上でなければ


クラスCubeのメンバ関数displayの定義内の


cout <<"オブジェクトのメンバ変数にマイナスのデータが入力されています" << "\n";


が実行され


0以上であれば


no = a;

tate = b;

yoko = c;

takasa = d;


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


no

tate

yoko

takasa

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

が代入された


cube1.no=a;

cube1.tate=b;

cube1.yoko=c;

cube1.takasa=d;


cout << "立方体につけられたナンバーは" <<cube1.no<< "です" << "\n";

cout << "立方体の縦の長さは" <<cube1.tate<< "です" << "\n";

cout << "立方体の横の長さは" <<cube1.yoko<< "です" << "\n";

cout << "立方体の高さの長さは" <<cube1.takasa<< "です" << "\n";


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


a

b

c

d

に代入される数値データは正の数値データなので


cube1.no=a;

cube1.tate=b;

cube1.yoko=c;

cube1.takasa=d;

により


cube1.no

cube1.tate

cube1.yoko

cube1.takasa

に代入される値も


正の数値データとなるというわけです


いかがですか。


このように設定しておけば


他の人に


Cubeのクラス宣言のデータを渡した場合でも


その人が


オブジェクト宣言


Cube cube1;


を実行し


生成される

オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


オブジェクトcube1のメンバ関数


cube1.display(int a, float b, float c, float d)



cube1.display(int a, float b, float c, float d)

int a

float b

float c

float d

に負の数値データ

-1

-5.0

-10.0

-122.5

を代入して


cube1.display(-1, -5.0, -10.0, -122.5);


を実行したとしても


オブジェクトのメンバ変数にマイナスのデータが入力されています


が表示されることになります



オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa

-1

-5.0

-10.0

-122.5


が代入されることもなければ


ビルド実行結果に


立方体につけられたナンバーは-1です

立方体の縦の長さは-5.0です

立方体の横の長さは-10.0です

立方体の高さの長さは-122.5です


が表示されるようなこともないというわけです。」


マックス「そ~か


つまり


カプセル化が


行われていないと


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


を直接使用することができるため


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


数値データ


-1

-5.0

-10.0

-122.5



cube1.no=-1;

cube1.tate=-5.0;

cube1.yoko=-10.0;

cube1.takasa=-122.5;


のように


代入することができてしまうわけだが


カプセル化が行われていると


オブジェクトcube1のメンバ関数


cube1.display(int a, float b, float c, float d)


を用いてしか


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


にアクセスすることができないため


オブジェクトcube1のメンバ関数に


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



マイナスの数値データが格納できないよう仕組みを設定しておけば


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



マイナスの数値データが格納されるようなこともないってわけだ


オブジェクトcube1のメンバ関数で


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



マイナスの数値データが格納されないよう


フィルターを


かけることができるってわけだ


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


  


  


カプセル化がおこなわれるというわけなんだな💖」






















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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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