🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラス宣言内のメンバ変数宣言のアクセス指定子をprivateに設定することによりmain関数内でオブジェクトのメンバ変数に直接アクセスできないようにすることをカプセル化といいます。
クラス宣言内のメンバ変数宣言のアクセス指定子を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
に
マイナスの数値データが格納されないよう
フィルターを
かけることができるってわけだ
オブジェクトのメンバ変数に
望んでいない数値データが代入されるのを防ぐために
望みでないプログラムの実行結果になるのを防ぐために
カプセル化がおこなわれるというわけなんだな💖」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます