ホームページ > バックエンド開発 > C++ > C++ フレンド関数とアクセス制御の間の競合

C++ フレンド関数とアクセス制御の間の競合

王林
リリース: 2024-04-16 18:09:01
オリジナル
637 人が閲覧しました

C では、フレンド関数とアクセス制御が競合する可能性があります。プライベート メンバーにアクセスするには、メンバーを保護済みとして宣言するか、プロキシ関数を使用します。たとえば、Student クラスにはプライベート メンバーの名前とスコアがあり、フレンド関数 printName と printScore はこれらのメンバーをそれぞれ出力できます。

C++ 友元函数与访问控制的冲突

C フレンド関数とアクセス制御の間の競合

C では、フレンド関数はクラスの非メンバーのプライベート メンバーにアクセスできます。関数。ただし、アクセス制御に関しては、フレンド関数がクラス メンバーのアクセス制御と競合する可能性があります。

アクセス制御

C は 3 つのアクセス制御レベルを提供します。

  • public: クラスから利用可能 どこでもアクセス。
  • protected: クラスとその派生クラスからのみアクセスできます。
  • private: クラス内からのみアクセスできます。

フレンド関数

フレンド関数は、friend キーワードを通じて宣言されます。フレンド関数は、アクセス制御レベルに関係なく、クラスのすべてのメンバーにアクセスできます。ただし、フレンド機能はクラスの一部にはなりません。

アクセス制御違反

アクセス制御違反は、フレンド関数がプライベート メンバーにアクセスしようとすると発生します。例:

class MyClass {
private:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};
ログイン後にコピー

この例では、printX 関数はクラスのフレンドですが、プライベート メンバー x にアクセスしようとしています。これにより、コンパイラ エラーが発生する可能性があります。

競合の解決

アクセス制御の競合を解決するには、次の方法を使用できます。

1. 保護されたメンバーを使用します。

プライベート メンバーを保護されたメンバーとして宣言します。これにより、派生クラスとフレンド関数がメンバーにアクセスできるようになります。

class MyClass {
protected:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};
ログイン後にコピー

2. プロキシ関数を使用する

プライベート メンバーのプロキシとして別のクラス メンバー関数を作成します。このプロキシ関数は、フレンド関数で使用するためにパブリックにアクセスできます。

class MyClass {
private:
    int x;

public:
    int getX() const { return x; }

friend void printX(MyClass& obj) {
    std::cout << obj.getX() << std::endl;
}
};
ログイン後にコピー

実践的なケース

次の実際のケースには、

name と # を持つ Student クラスがあります。 ##score2 人のプライベート メンバー。これらのプライベート メンバーをそれぞれ出力するために、2 つのフレンド関数 printName()printScore() を作成したいと考えています。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:cpp;toolbar:false;'>class Student { private: std::string name; int score; friend void printName(Student&amp; obj) { std::cout &lt;&lt; &quot;Name: &quot; &lt;&lt; obj.name &lt;&lt; std::endl; } friend void printScore(Student&amp; obj) { std::cout &lt;&lt; &quot;Score: &quot; &lt;&lt; obj.score &lt;&lt; std::endl; } };</pre><div class="contentsignin">ログイン後にコピー</div></div>フレンド機能を使えば、非公開会員であっても簡単に生徒の名前や成績を印刷することができます。

int main() {
    Student student;
    student.name = "John Doe";
    student.score = 95;

    printName(student);
    printScore(student);

    return 0;
}
ログイン後にコピー

出力:

Name: John Doe
Score: 95
ログイン後にコピー

以上がC++ フレンド関数とアクセス制御の間の競合の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート