こんにちは。
最下部に5つ質問がありますので、答えられる範囲で
お願いします。全部解答してくださる方大歓迎です(#^^#)
C++だとカプセル化ができますが、
ゲッター、セッターを使わずに
クラスのprivateメンバを直接、そのクラスのインスタンスから
変更したり取得したりすることが可能です。
クラス型の変数をインスタンス化せずに
そのprivateメンバにアクセスすること自体はできます。
以上のことからカプセル化およびゲッター・セッターってどういったときに
使うものなのだろうかと疑問がわいたので質問します。
まず、私の見解は間違ってますか?
カプセル化およびゲッター・セッターは必要なものでしょうか?
必要だとしたらあなたならどういった用途で使いますか?
C++が初心者なので、他言語との違いを含めてアドバイスください。
大規模開発にカプセル化が必要だということですか?
よろしくお願いしますー
c++
1**Sample.h** 2 3#ifndef _SAMPLE_H_ 4#define _SAMPLE_H_ 5 6class Sample{ 7public: 8 int a; // publicなメンバ変数 9private: 10 int b; // privateなメンバ変数 11public: 12 void func1(); 13private: 14 void func2(); 15}; 16 17#endif // _SAMPLE_H_
c++
1**Sample.cpp** 2 3#include "Sample.h" 4#include <iostream> 5 6using namespace std; 7 8void Sample::func1(){ 9 cout << "func1" << endl; 10 a = 1; 11 b = 1; 12 func2(); // func2ないから、func1を呼び出す 13} 14void Sample::func2(){ 15 a = 2; 16 b = 2; 17 cout << "a=" << a << "," << "b=" << b << endl; 18}
c++
1**main.cpp** 2 3#include "Sample.h" 4#include <iostream> 5 6using namespace std; 7 8int main(){ 9 Sample s;//←このsがインスタンス化されてないものと思ってました 10 s.a = 1; 11 //s.b = 2; 12 s.func1(); 13 //s.func2(); 14}
学び始めのためか、用語を不正確に使っていて閲覧者に正確に伝わってないと思います。多分具体的なコードを書いて、「(1)の行でやっているように」といった説明をすれば閲覧者にも意味がくみ取れると思います。
コードの明示で「Sample s;」がインスタンスの生成である点に気づかれたことがわかります。これを勘違いしていたため、「インスタンスを生成する前でもpublicメンバー関数にアクセスできるからその中からprivateにアクセスできる」と勘違いされていたのだろうと思います。誤解が解消されてみると、Chironianさんが回答されているカプセル化・getter/setterについての回答が腑に落ちるのではないでしょうか?