산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ friend 함수 및 friend 클래스

C++ 친구 함수 및 친구 클래스

이 튜토리얼에서는 예제를 통해 C++로 friend 함수와 friend 클래스를 만드는 방법을 배웁니다.

데이터 은닉은 객체 지향 프로그래밍의 기본 개념입니다. 클래스 외부에서 private 멤버의 액세스를 제한합니다.

마찬가지로 보호된 멤버는 파생 클래스에서만 액세스할 수 있으며 외부에서는 액세스할 수 없습니다. 예를 들어,

class MyClass {
    private:
        int member1;
}

int main() {
    MyClass obj;

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

그러나 C++에는 친구 함수라는 기능이 있습니다. 이 규칙을 어기고 클래스 외부에서 멤버 함수에 액세스할 수 있습니다.

마찬가지로 친구 클래스가 있습니다. 이 튜토리얼의 뒷부분에서 배울 것입니다.

<시간>

C++의 friend 함수

친구 기능 비공개 액세스 가능 및 보호 클래스의 데이터. friend을 사용하여 friend 함수를 선언합니다. 클래스 본문 내부의 키워드입니다.

class className {
    ... .. ...
    friend returnType functionName(arguments);
    ... .. ...
}
<시간>

예시 1:friend 함수의 작업

// 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:서로 다른 두 클래스의 구성원 추가

// 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()을(를) 선언했습니다. 친구 기능으로. 따라서 이 기능은 비공개 두 클래스의 데이터입니다.

여기서 주목해야 할 한 가지는 ClassA 내부의 friend 함수입니다. 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 {
   ... .. ...
}

클래스가 friend 클래스로 선언되면 friend 클래스의 모든 멤버 함수는 friend 함수가 됩니다.

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. 자바 - 객체와 클래스
  8. C++의 스토리지 클래스
  9. C++ 날짜 및 시간
  10. C++ 오버로딩(연산자와 함수)