7

アクセス修飾子 Public, Private and Protectedは単なるコンパイラーのものであり、コンパイルされたバイナリコードには実際には存在しないと聞きました。

今、私はそれがどれくらい正しいのだろうかと思いますか?そしてそれが正しければ、それはカプセル化が実行時にバイナリコードに存在しないことを意味しますか?したがって、バイナリを変更してPrivateメソッドに不正にアクセスした場合、理論的には、OOPメカニズムもオペレーティングシステムも、権利をチェックするものは何もありません。

また、C++とJavaの両方の質問にタグを付けました。私はそれらの違いを知っていますが、AccessModifiersの処理の違いを知りたいだけです。

4

3 に答える 3

8

アクセス修飾子は、C++ のコンパイル時のメカニズムにすぎません。ただし、Java では、Java にも実行時型システムがあり、動的に (実行時に) クラスを作成できるため、これらは実行時にも適用されます。そのため、コンパイル時にわからない型に対しても、実行時にアクセスを強制する必要があります。

アクセス修飾子を使用する理由

アクセス修飾子の唯一の目的は、設計を強化することです。

A実装したクラスがあるとします

class A
{
public:
  void DoSomething()
  {
    // use private member mPrivMember to do something
  }
private:
  int mPrivMember;
}

そして class を使ったいくつかのコードA:

A a_obj;

上記のコードは を呼び出すことができますがa_obj.DoSomething()、mPrivMember に直接アクセスできないため、a.mPrivMemberクラス外に記述したA場合はコンパイルされません。

では、外部コードからアクセスできるメンバーとそうでないメンバーが必要なのはなぜでしょうか。その理由は次のとおりです。現時点では、メソッドDoSomething()mPrivMember実際に何かを行うために使用されます。しかし、しばらくすると、DoSomething のコードをリファクタリングして改善したいと思うかもしれません。もう使用する必要のない何かを行う別の方法を見つけましたmPrivMember。したがって、他の方法で削除mPrivMemberして再実装します。DoSomething

を使用してクラス外にコードがあった場合、 を再実装するときmPrivMemberに削除したため、そのコードはコンパイルされなくなります。このようなコードの存在を防ぐには、へのアクセスを制限します。これを行うメカニズムは、やなどのアクセス修飾子を使用することです。mPrivMemberDoSomethingmPrivMemberprivateprotected

これにより、他のコードが内部メンバーを使用する可能性を心配することなく、将来コードをリファクタリングできます。

要約

public privateおよびprotectedC++ のコンパイル時のメカニズムです。それらはプログラムの生成されたバイナリ形式には存在しないため、そのような保護は適用されません。どこからでも何でもアクセスできます。

ただし、Java では、私が間違っていなければ、実行時にクラスを作成できます。Private Publicこれが、実行時にもアクセスをチェックして強制できるようにする必要がある理由でありProtected、Java バイナリに存在します。

于 2013-03-22T06:32:39.653 に答える
2


この回答は Java Bothに関するものであることに注意してください。アクセスできないオブジェクトまたはメソッドにアクセスしようとするコードをコンパイルしようとすると、コンパイル時エラーが発生します。

実行時に、JVM はアクセスをチェックします。

実行時にアクセスしようとすると、次の例外が発生します。アクセスレベルが不適切な場合 java.lang.IllegalAccessError:

それが役に立てば幸い

于 2013-03-22T06:28:33.087 に答える
1

コンパイルされた C++ コードには、プライベート/保護/パブリックの概念がありません。それは、それらの概念を持たないマシンコードにまで及びます。そのためのネイティブ サポートがなければ、どのようにサポートできますか? さらに良いことに、それをネイティブでサポートするにはどうすればよいでしょうか。

アクセス修飾子は人間用であり、マシン用ではありません。アクセス修飾子は、セキュリティの側面ではなく、設計の側面です。

tl;dr : C++ コードが実際に実行されるまでに、マシンは非公開/公開/保護が存在したことを認識していません。

于 2013-03-22T06:32:51.607 に答える