工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++ フレンド関数とフレンド クラス

C++ フレンド関数とフレンド クラス

このチュートリアルでは、例を使用して C++ でフレンド関数とフレンド クラスを作成する方法を学習します。

データ隠蔽は、オブジェクト指向プログラミングの基本概念です。クラス外からのプライベート メンバーのアクセスを制限します。

同様に、保護されたメンバーは派生クラスからのみアクセスでき、外部からはアクセスできません。たとえば、

class MyClass {
    private:
        int member1;
}

int main() {
    MyClass obj;

    // Error! Cannot access private members from here.
    obj.member1 = 5;
}

ただし、C++ には フレンド関数 と呼ばれる機能があります。 このルールを破り、クラスの外部からメンバー関数にアクセスできるようにします。

同様に、フレンド クラスがあります。 これについては、このチュートリアルの後半で学習します。


C++ のフレンド関数

フレンド機能 プライベートにアクセスできます そして保護 クラスのデータ。 friend を使用してフレンド関数を宣言します クラスの本体内のキーワード。

class className {
    ... .. ...
    friend returnType functionName(arguments);
    ... .. ...
}

例 1:フレンド関数の動作

// C++ program to demonstrate the working of friend function

#include <iostream>
using namespace std;

class Distance {
    private:
        int meter;
        
        // friend function
        friend int addFive(Distance);

    public:
        Distance() : meter(0) {}
        
};

// friend function definition
int addFive(Distance d) {

    //accessing private members from the friend function
    d.meter += 5;
    return d.meter;
}

int main() {
    Distance D;
    cout << "Distance: " << addFive(D);
    return 0;
}

出力

Distance: 5

ここで、addFive() プライベート両方にアクセスできるフレンド機能です と一般公開 データ メンバー。

この例は、フレンド機能の概念についてのアイデアを与えてくれますが、意味のある使い方は示していません。

より意味のある使用法は、2 つの異なるクラスのオブジェクトを操作することです。そんな時、フレンド機能がとても役に立ちます。


例 2:2 つの異なるクラスのメンバーを追加する

// Add members of two different classes using friend functions

#include <iostream>
using namespace std;

// forward declaration
class ClassB;

class ClassA {
    
    public:
        // constructor to initialize numA to 12
        ClassA() : numA(12) {}
        
    private:
        int numA;
        
         // friend function declaration
         friend int add(ClassA, ClassB);
};

class ClassB {

    public:
        // constructor to initialize numB to 1
        ClassB() : numB(1) {}
    
    private:
        int numB;
 
        // friend function declaration
        friend int add(ClassA, ClassB);
};

// access members of both classes
int add(ClassA objectA, ClassB objectB) {
    return (objectA.numA + objectB.numB);
}

int main() {
    ClassA objectA;
    ClassB objectB;
    cout << "Sum: " << add(objectA, objectB);
    return 0;
}

出力

Sum: 13

このプログラムでは、 ClassAClassB add() を宣言しました フレンド機能としてしたがって、この関数は private にアクセスできます 両方のクラスのデータ

ここで注目すべき点は、ClassA 内のフレンド関数です。 ClassB を使用しています .ただし、ClassB は定義していません。 この時点で。

// inside classA 
friend int add(ClassA, ClassB);

これが機能するには、 ClassB の前方宣言が必要です

// forward declaration
class ClassB;

C++ のフレンド クラス

friend を使用して、C++ でフレンド クラスを使用することもできます。 キーワード。たとえば、

class ClassB;

class ClassA {
   // ClassB is a friend class of ClassA
   friend class ClassB;
   ... .. ...
}

class ClassB {
   ... .. ...
}

クラスがフレンド クラスとして宣言されると、フレンド クラスのすべてのメンバー関数がフレンド関数になります。

ClassB以降 はフレンド クラスです。ClassA のすべてのメンバーにアクセスできます。 ClassB の中から .

ただし、ClassB のメンバーにはアクセスできません。 ClassA の中から .これは、C++ でのフレンド関係が付与されるだけであり、取得されないためです。


例 3:C++ フレンド クラス

// C++ program to demonstrate the working of friend class

#include <iostream>
using namespace std;

// forward declaration
class ClassB;

class ClassA {
    private:
        int numA;

        // friend class declaration
        friend class ClassB;

    public:
        // constructor to initialize numA to 12
        ClassA() : numA(12) {}
};

class ClassB {
    private:
        int numB;

    public:
        // constructor to initialize numB to 1
        ClassB() : numB(1) {}
    
    // member function to add numA
    // from ClassA and numB from ClassB
    int add() {
        ClassA objectA;
        return objectA.numA + numB;
    }
};

int main() {
    ClassB objectB;
    cout << "Sum: " << objectB.add();
    return 0;
}

出力

Sum: 13

ここでは、ClassB ClassA のフレンドクラスです .つまり、ClassB classA のメンバーにアクセスできます .

ClassB で 、関数 add() を作成しました numA の合計を返します そして numB .

ClassB以降 はフレンド クラスです。ClassA のオブジェクトを作成できます。 ClassB の中 .


C言語

  1. C# クラスとオブジェクト
  2. C# の抽象クラスとメソッド
  3. C# 部分クラスと部分メソッド
  4. C# の封印されたクラスとメソッド
  5. C++ クラスとオブジェクト
  6. 構造体とクラスの違い:C++ の例で説明
  7. Java - オブジェクトとクラス
  8. C++ のストレージ クラス
  9. C++ 日付と時刻
  10. C++ オーバーロード (演算子と関数)
  11. C++ のポリモーフィズム