- 締切済み
C,C++,Javaの変数の種類
クラス、構造体の変数の中で外部からアクセスできないという設定があります。アクセスできないというのは、 0.値を見ることができるが変更はできない(定数のような感じ? 消費税率とか?) 1.値を見ることはできないが変更することはできる(銀行預金額面風?) 2.値を見ることも変更することもできない (どう利用するのでしょうか?) にわかれるように思います。もし2ならば、その変数は構造体、クラスの外部に影響を与えないように思います。すなわちそのような変数の使用が何を目的としているか不明になるように思いますが。 例えば、Xを2の意味で隠蔽していたとします。 Yを与えて、Z=Y*Xを計算し、Zの値を取り出すと、Xの値が間接的にわかることになります。これだと変数を隠蔽したことならないのでこのような使い方もエラーになるだろうと思いますが。 すなわち、アクセスできないとはどういう意味になるのでしょうか。 C,C++,Javaを同時に見ており、private, staticなどいろいろあって混乱してしまいました。 変数のアクセス制限・隠蔽についてどのように整理すればよろしいでしょうか。 よろしくお願いします。
- みんなの回答 (11)
- 専門家の回答
みんなの回答
- Wap58
- ベストアンサー率33% (29/87)
2は言語の仕様や組み込み関数など、例えばコメント C言語だと /* <= 内部で保持されるのでしょう */ <= これを見つけるまで探します なので、これはダメ /* //* なんじゃかんじゃ */ <= ここでエラー */ ___________________________________ これならいけるんで正しんでしょ /* //* なんじゃかんじゃ */ ___________________________________
- amanojaku1
- ベストアンサー率54% (265/488)
Javaを前提に説明します。 なお、(Javaの場合)アクセス修飾子に関しては「public、protected、未指定、private」の4種類が有ります、詳細は下記ページの『アクセス修飾子(public, protected, private)』の項を参照して下さい。 修飾子 http://www.tohoho-web.com/java/modifier.htm
- amanojaku1
- ベストアンサー率54% (265/488)
> コンパイラーに対する指示:「private」→「他から勝手に読み書きできない」 > プログラマーに対するメッセージ:「private」→「他から勝手に変更しないでね」 このように「private」にはコンパイラーに対する指示とプログラマーに対する明示的なメッセージの2つの意味が込められています。
- amanojaku1
- ベストアンサー率54% (265/488)
> 「private」により「他から勝手に読み書きできません」と指定する事で、プログラマーに対し「他から勝手に変更しないでね」と言う明示的なメッセージとなり コンパイラーに対する指示:「private」→「他から勝手に読み書きできない」 プログラマーに対するメッセージ:「private」→「他から勝手に変更しないでね」
- amanojaku1
- ベストアンサー率54% (265/488)
訂正。 > 「Move」と言うメソッドに「5m・前進」、「45度・右折」、「3m・後退」などのようなパラメータを設定し、ASIMO君オブジェクトに命令して移動させたとします ASIMO君オブジェクトに「Move」と言うメソッドで「5m・前進」、「45度・右折」、「3m・後退」などのように命令して移動させたとします
- amanojaku1
- ベストアンサー率54% (265/488)
> Javaを前提に説明します。 > > ちなみに「static」はプリミティブ型(変数、定数)ならクラス内であっても、インスタンスを生成しないでアクセスできます。 > デメリットは複数のインスタンスを生成しても「static」「変数、定数」は1つの共通したアドレスのメモリーを参照します。 > 例えば、1つのインスタンスで「static」変数Aを変更すると、他のインスタンスの「static」変数Aも その値に変化します。 (実際にはメモリー・アドレスは動的に変化しているかもしれないけど)「static」の意味合いとしては、1つの共通した静的(static)なメモリー・アドレス空間と言う様な意味合いだと思われます。
- amanojaku1
- ベストアンサー率54% (265/488)
Javaを前提に説明します。 ちなみに「static」はプリミティブ型(変数、定数)ならクラス内であっても、インスタンスを生成しないでアクセスできます。 デメリットは複数のインスタンスを生成しても「static」「変数、定数」は1つの共通したアドレスのメモリーを参照します。 例えば、1つのインスタンスで「static」変数Aを変更すると、他のインスタンスの「static」変数Aも その値に変化します。
- amanojaku1
- ベストアンサー率54% (265/488)
訂正。 > (間違ってアクセスしようとしたらコンパイラーがエラーを出してくらますので)プログラマーのヒューマン・エラーを少し減らせます。 (もし間違ってアクセスしようとしてもコンパイラーがエラーを出してくれますので)プログラマーのヒューマン・エラーを少し減らせます。
- amanojaku1
- ベストアンサー率54% (265/488)
訂正。 > 「Z=Y*X」のような単純な式では暗号化のような難解なモノなら、内部の値は推測できないでしょうが 「Z=Y*X」のような単純な式ではなく暗号化のような難解なモノなら、内部の値は推測できないでしょうが
- amanojaku1
- ベストアンサー率54% (265/488)
> クラス、構造体の変数の中で外部からアクセスできないという設定があります。アクセスできないというのは、 > 0.値を見ることができるが変更はできない(定数のような感じ? 消費税率とか?) > 1.値を見ることはできないが変更することはできる(銀行預金額面風?) > 2.値を見ることも変更することもできない (どう利用するのでしょうか?) > にわかれるように思います。もし2ならば、その変数は構造体、クラスの外部に影響を与えないように思います。すなわちそのような変数の使用が何を目的としているか不明になるように思いますが。 「C、C++」など知らないのでJavaを前提に説明します。 (Javaでは)「static」は定数ではありません、「0」のような定数は「final」です。 Javaの場合、完全な定数と言う訳ではなく(初期値が設定されてない)未設定の「final」定数はコンストラクターで1回だけ代入できます。 (Javaでは)基本的に「1」は存在しません(「1」の機能を実現したい場合はメソッドでprivate変数を設定できるようにすれば可能です)。 (Javaでは)「2」は「private」です。 > 例えば、Xを2の意味で隠蔽していたとします。 > Yを与えて、Z=Y*Xを計算し、Zの値を取り出すと、Xの値が間接的にわかることになります。これだと変数を隠蔽したことならないのでこのような使い方もエラーになるだろうと思いますが。 エラーにはなりません。 「Z=Y*X」のような単純な式では暗号化のような難解なモノなら、内部の値は推測できないでしょうが、(内部の値を推測できるか どうかと言うより)基本的には隠蔽は「他から勝手に変更しないでね」と言う意味です。 > すなわち、アクセスできないとはどういう意味になるのでしょうか。 「private」により「他から勝手に読み書きできません」と指定する事で、プログラマーに対し「他から勝手に変更しないでね」と言う明示的なメッセージとなり、(間違ってアクセスしようとしたらコンパイラーがエラーを出してくらますので)プログラマーのヒューマン・エラーを少し減らせます。 具体的にASIMO君オブジェクトを例に説明します(ASIMO君に関しては次のリンクを参照の事)。 あの、ホンダ「ASIMO」が更なる進化を遂げた! http://autoc-one.jp/honda/special-1510890/ 「Move」と言うメソッドに「5m・前進」、「45度・右折」、「3m・後退」などのようなパラメータを設定し、ASIMO君オブジェクトに命令して移動させたとします、それにより相対位置とか向きとかの内部・変数が移動した分だけ変化したとします。 もし、あなたが勝手に その内部・変数を変更してしまうと、ASIMO君オブジェクトは その間違ったデータが自分の位置だと認識してしまう訳で、勝手に他から変更されては困るモノを「private」に指定します。 でも実際のプログラミングでは あまり厳密に「private」を指定してないのが現状です。
- 1
- 2