5

典型的なアクセス指定子とは何か、そしてそれらが何を意味するのかを理解しています。「パブリック」メンバーはどこからでもアクセスでき、「プライベート」メンバーは同じクラスや友達だけがアクセスできます。

私が疑問に思っているのは、どちらかといえば、これが低レベルの用語で何に相当するかということです。それらが使用されている言語(この場合はc ++)によって課せられた高レベルの制限(何が何にアクセスできるか)を超えて、これらの間のコンパイル後の機能の違いはありますか?

別の言い方をすれば、これがプログラマーが常に良い選択をした完璧な世界である場合(後で変更される可能性のあるメンバーにアクセスせず、実装間で同じままである必要がある明確に定義されたメンバーのみを使用するなど)、これらを使用する理由は何ですか?もの?

4

5 に答える 5

10

アクセス指定子は、コンパイル目的でのみ存在します。プログラムの割り当て内のメモリには、実行可能ファイルの任意の部分からアクセスできます。実行時にパブリック/プライベートの概念はありません

于 2010-05-03T16:57:16.800 に答える
2

マイケルの答えは正しいです。アクセス指定子は、結果のコードに直接影響しません。

ただし、アクセス指定子は、コンパイルを妨げるあいまいな識別子/オーバーロードエラーを解決する場合があります。

class A {
private:
    int x;
};

class B {
protected:
    int x;
};

class C : public A, public B {
public:
    int &get_x() { return x; } // only B::x is accessible, no error.
};

したがって、プログラマーを制限するよりも、間違いなく高い目的を果たします。

于 2010-05-03T19:37:22.903 に答える
1

あなたの質問に対する答えはコンパイラーによって異なるかもしれませんが、一般的には違いはありません。コンパイルされたコードがそれらの異なるアクセシビリティに対して異なる特性を持っているかもしれない環境を想像することができますが、私は存在するものを知りません。

于 2010-05-03T16:59:15.390 に答える
1

プログラマーは、適切な情報を備えている場合にのみ、適切な選択を行うことができます。アクセス修飾子は、特定のものに触れてはならないことをプログラマーに通知する方法であり、正しい動作を強制するという副次的な利点があります。

実行時の影響はありません。正しいアクセス修飾子を使用してプログラムを作成し、、を使用してc++ -Dprotected=public -Dprivate=public file.ccビルドすると、ほぼ同じコードをビルドおよび生成する必要があります(クラスのデータレイアウトなど、いくつかの仮想的な警告があります)。

于 2010-05-03T17:02:00.157 に答える
1

コンパイル後、「パブリック」または「プライベート」(またはクラス、メンバーなど)の概念を持たないマシンコード(アセンブリ)が残ります。すべてが単なるメモリアドレス(コードであろうとデータであろうと)であり、他のメモリアドレスと同じようにアクセスできます。public \ privateの区別全体(および高水準言語で利用可能な他のほとんどすべての構造)は、純粋にプログラマーの利益のためであり、コンパイラーがコードの意図を作成することを目的とした一連のルールを適用できるようにしますより明確になり、潜在的なバグを回避するのに役立ちます。コンパイルされると、コードは最初に記述された言語、ましてや使用されたアクセス指定子のタイプを認識しません。

そうは言ってもprivate、関数が不適切に呼び出されたことを検出するために、クラスメンバー関数が呼び出されるたびにコードを変更するようにコンパイラーをリグすることは可能です(関数が不適切に呼び出されたときにパラメーターを追加し、期待値に設定します)クラス内から呼び出されます。クラス外から関数を呼び出すと、間違った値が提供されます)。このアプローチの問題は、あなたが今何をしているのかということです。閉じ込める?何もせずに無効なデータを返しますか?これらのタイプの問題は、コンパイル時に(比較的)簡単に検出および修正できるため、実行時に(デバッグまたはコードプロファイリングツール以外で)この種の問題が強制されることはめったにありません。

于 2010-05-03T17:10:49.190 に答える