6分SHAREツイートシェアはてブLINEPocket今井こんにちは。今井(@ima_maru)です。この記事で書かれてることカプセル化ってどういう意味?privateとpublicって?カプセル化のメリットは?このような疑問をプログラミングが初めての方にもわかるように、わかりやすく解説します。終わりにカプセル化(encapsulation)とは?カプセル化とは、オブジェクトの情報を隠蔽することによって、不整合を引き起こすような操作をできなくさせる仕組みです。」程度の感覚で見てもらって大丈夫です。下に行くにつれて詳しく解説して行きます。カプセル化の仕組み簡単にC++のサンプルコードでカプセル化の仕組みを見ていきましょう。//○アクセス可能}ここで、クラスAのxはカプセル化されていて、yはカプセル化されていません。その違いは「public:」以前に定義されているかされていないかの違いです。カプセル化されているメンバ変数やメンバ関数にはクラスの外からはアクセスできません。main文からは、aのxにアクセスしようとしてもできないことがわかります。反対にaのyはpublic:によってカプセル化が解かれているのでmain文からでもアクセスができるようになっています。カプセル化で重要なprivateとpublicクラス内でメンバを定義する際に、int(整数型)やchar(文字型)などの定義のほかに別枠で、privateとpublicと呼ばれる枠組みがあります。(protected)一般に、「privateなメンバはクラスのスコープの外側からはアクセスができず、publicなメンバはクラスのスコープの内側と外側どちらからでもアクセス可能である。スコープという難しいようなことを言っていますが、ようは、外からアクセスできるかできないかの違いです。上のサンプルコードと照らし合わせてるとわかりやすいと思います。y;};xはint(整数)型でありprivateなメンバ変数です。privateは省略できますのでこう書くこともできます。y;};ざっくり言えばclass定義の中で「public:」以前に定義されているものはprivateなメンバです。yはint(整数)型でpublicなメンバ変数ということができます。この時、xはカプセル化されていてyはカプセル化されていないといえます。「保護されているかされていないか」、または「外からアクセスできるかできないか」と言い換えることもできます。※protectedは継承にかかわる機能です。カプセル化の狙いとメリットについて解説カプセル化の狙いはズバリいうと「不整合の防止」です。わかりやすく言えば、「バグの防止」とか「情報の保護」とか言えばわかりやすいと思います。メリットだけ見たい方は下にスクロールしてください。Point)つまりは体力を持っています。MAX_HP(体力の上限値)も持ち合わせていますね。800/1000よくこんな風にHP/MAX_HPでステータスを表したりします。このときのHP=800,MAX_HP=1000になります。戦いでHPは減っていくものです。ほとんどのRPGは、宿屋や薬草などの「回復する手段」を持っていますよね。そこで、薬草の説明欄がこういうものだったとしましょう。薬草:HPを500回復するよくありますよね。1300/1000体力が上限値を超えてしまいました!これを不整合(バグ)と言ったりします。こんなことあってはいけません!(たまにこういう仕様のゲームもあったりしますが、今回はこのようなことを許したくない!)では、「この主人公の体力を回復させたい!」と思ったときのために、HPを回復するプログラムを「カプセル化」をうまく利用して考えましょう。カプセル化を利用したHP回復プログラム一気にソースコード書かれると混乱する方もいらっしゃると思いますので、下のほうで1対1で解説しています。C++がわからない方でも読めるようにコメントを書いてあります。最初の2行は標準入出力や名前空間の定義なので、C++特有のおまじないだと思ってください。//○アクセス可Hero.Show_status();}それでは、解説していきます。クラス「Human」の定義から見ていきましょう。};class(クラス)定義はこのように表しますね。今回はHumanというクラスを作ることにしました。中身を見ていきましょう。int(整数)型のMAX_HPを定義public:これ以降に宣言したメンバ変数やメンバ関数をクラスの外からでもアクセス可能にします。今回はHPとMAX_HPをmain文からアクセス不可にして、それ以外はmain文からでもアクセス可能(使用できるよう)にしています。Show_status(){...}「HP/MAX_HP」の形でステータスを表示するメンバ関数コンストラクタの定義です。初期作成時に仮引数max_hpを受け取ります。それをHPとMAX_HPに代入します。今回ですとHero(1000)となっていますのでHP=MAX_HP=1000で作成されます。1000/1000ということですね。MAX_HP;}オブジェクト自身でHPを変更するChange_HPについての定義です。ややこしいですが、Humanクラスのメンバ関数なのでHumanのprivateなメンバ変数HPやMAX_HPにアクセスすることができます。sum_HPHPを仮引数sizeを足した値を格納。これによって条件分岐。0計算結果sum_HPが0を下回ってしまうときはHP=0に設定。sum_HP上の条件には入らず、さらに上限値(MAX_HP)をsum_HPが超えないときはそのままHP=sum_HPに設定。MAX_HP上二つの条件に入らなかったとき(計算結果がMAX_HPを超えてしまったとき)HPは上限値MAX_HPに設定。(上限まで回復)ということになります。そんなメンバ関数です。//○アクセス可Hero.Show_status();}HumanクラスのHeroを作成します。1000/1000です。800/1000にします。これはコンパイルエラーになります。+=は加法で、A.HPに500を足すという意味です。カプセル化によって保護されているprivateなメンバ変数なので、main文から直接アクセスすることはできません。1300/1000になってしまいますので不整合を引き起こしてしまいます。今回はこのような不整合がカプセル化によってできなくなっています。これはsizeに500を受け取ったときの体力の変更プログラムですね。オブジェクト自身で体力を変更する、すなわち、Hero.HPにHeroそのものがアクセスすることになりますので、カプセル化は適用されません。よってアクセス可能となります。HPは上で解説した通り0~MAX_HPの範囲で変更されます。今回は上限値を超える計算になるため上限値である1000に変更されます。1000/1000になります。カプセル化のメリットとは?カプセル化はこのHPが上限値を超えてしまわないようなプログラム設計からもわかる通り、情報を直接操作することをできなくして情報が壊れてしまうことを防止する役目を担っています。オブジェクト自身に適切な情報操作を委ねるというのがポイントとなります。「"100%流れが来ている職業"に、ほぼ"100%転職できる"としたら、あなたは悩みますか?それとも今すぐ行動しますか?」なおホリエモンも認めたプログラミングスクールで稼げる人材になろう!\稼げる人材になることに特化!/"転職成功率99%"のTECH::EXPERTはこちら※14日間の全額返金保証付き終わりにオブジェクト指向3大要素の一つともされる「カプセル化」をできる限りわかりやすく説明したつもりですが、どうでしたでしょうか?カプセル化というのは、最初聞いたとき「なんで情報を隠す必要があるんだ?」と思いましたが、C++を学習していくうちに少しずつ理解が深まりました。この記事を見て「なるほどなぁ、そういうことか」と思ってくださる方がいれば、とても嬉しいです。オブジェクト指向のメリットとは?例に例えてわかりやすく解説!以上、「【C++】カプセル化とは?わかりやすく解説!」でした。最後まで読んでいただきありがとうございます。コメントをキャンセルメールアドレスが公開されることはありません。週1でブログ書いてます。