質問: 2; s.func1(); //s.func2(); } ```
回答: > > クラス型の変数をインスタンス化せずに > > そのprivateメンバにアクセスすること自体はできます。 > > > インスタンス化しないと、そのメンバは存在しないのでアクセスできません。 ただし、staticなメンバは実行開始直後に初期化されるので、そのクラス型の変数をインスタンス化に関係なく、アクセスできます。 > > ゲッター、セッターを使わずに > > クラスのprivateメンバを直接、そのクラスのインスタンスから > > 変更したり取得したりすることが可能です。 > > > もちろんできます。そのクラス自体から変更したり取得できなければ、一切アクセスが不可能になります。 他のクラスから勝手に変更したり取得できては困るメンバのゲッター、セッターをprotectedやpublicで定義しておき、他のクラスからの変更・取得はセッター・ゲッターを通じてのみ行うようにしておけば、メンバが保護されるのです。 例えば、メンバが1~12までの整数しか許容しない場合、他のクラスが仮に13を設定しようとセッターを呼び出せば、セッターはそれをエラーとして検出できます。そのメンバをpublicにしてしまうと、他のクラスが勝手に不正な値を設定できてしまいます。 また、複雑な過程を経てメンバの値が算出される場合、「このタイミングではまだ値が入っていないからアクセスしないでください」というルールを周知させることは難しいです。「どのタイミングならOKなんだ?」という苦情が他のクラスから来るかもしれません。「このゲッターを呼び出しさえすればどのタイミングでもOK」の方が簡単です。 自分のクラスは自分のメンバに自由にアクセスできますが、それは自分のクラスは自分のメンバの扱い方についてよく知っているはずなので、問題ありません。 メンテナンスでクラスの実装方法を変更することはとてもよくあります。メンバが追加されたり廃止されたり名前が変わったり役割が変わったり。クラスの全てのメンバのセッター・ゲッターを他のクラスに公開する必要はありません。出入り口すなわち限定されたセッター・ゲッターをさえ作っておけば、他のクラスからの利用方法が変わっても、内輪の事情が変わっても、コードの変更箇所を拡散させずに済むのです。 C++ではゲッター・セッターが関数呼び出し形式でしか提供できませんが、C#という言語ではゲッター・セッターがメンバ変数のようにアクセスできる「プロパティ」というものがあります。詳しい事は他の方に譲ります。 カプセル化の必要性は中規模開発で十分に感じます。 質問者さんに合わせて、メンバ変数のことを単に「メンバ」と呼びました。