English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ 에서 친구 함수와 친구 클래스를 배웁니다.

이 문서에서는 C ++에서 친구 함수와 친구 클래스를 생성하고 프로그램에서 효과적으로 사용하는 방법을 배웁니다.

OOP중요한 개념 중 하나는 데이터 숨기기입니다. 즉,비회원 함수객체의 비공개 또는 보호된 데이터에 접근할 수 없습니다.

하지만, 때로는 이러한 제한이 프로그래머가 긴장하고 복잡한 코드를 작성하게 만들 수 있습니다. 따라서 C ++프로그래밍은 비회원 함수에서 비공개 또는 보호된 데이터에 접근할 수 있는 메커니즘을 제공합니다.

친구 함수와 친구 클래스를 사용하여 완료됩니다.

C ++의 친구 함수를 사용할 수 있습니다.

함수를 친구 함수로 정의하면,함수클래스의 비공개 데이터와 보호된 데이터에 접근할 수 있습니다.

키워드를 사용하여friend, 컴파일러는 주어진 함수가 친구 함수임을 알고 있습니다.

데이터에 접근하려면, 클래스 내부에서 키워드 friend로 시작하는 친구 함수를 선언해야 합니다(클래스 내부의 어느 곳에서든, private 부분이든 public 부분이든).

C ++의 친구 함수 선언

class class_name
{
    ... .. ...
    friend return_type function_name(argument)/s);
    ... .. ...
}

지금, 친구 함수를 클래스 데이터에 접근할 수 있는 일반 함수로 정의할 수 있습니다. friend 정의에서는 어떤 키워드도 사용되지 않습니다.

class className
{
    ... .. ...
    friend return_type functionName(argument)/s);
    ... .. ...
}
return_type functionName(argument/s)
{
    ... .. ...
    // className의 비공개 및 보호 데이터에 접근할 수 있습니다
     //이 함수가 className의 프렌드 함수라면
    ... .. ...
}

示例1:프렌드 함수의 작동

/* C ++프로그램은 프렌드 함수의 작동 방식을 시연합니다.*/
#include <iostream>
using namespace std;
class Distance
{
    private:
        int meter;
    public:
        Distance(): meter(0) { }
        //프렌드 함수
        friend int addFive(Distance);
};
// 프렌드 함수 정의
int addFive(Distance d)
{
    //비 멤버 함수에서 비공개 데이터 접근
    d.meter += 5;
    return d.meter;
}
int main()
{
    Distance D;
    cout << "거리: " << addFive(D);
    return 0;
}

출력 결과

거리: 5

여기서는 프렌드 함수 addFive()가 Distance 클래스에서 선언되었습니다. 따라서 이 함수에서 비공개 데이터에 접근할 수 있습니다.

이 예제는 프렌드 함수 개념에 대한 아이디어를 제공했지만, 의미 있는 사용법을 보여주지 않았습니다.

두 개의 다른 클래스의 객체에 대한操作이 필요할 때, 더 의미 있는 사용법이 있습니다. 그때, 프렌드 함수는 매우 유용합니다.

두 개의 다른 클래스의 객체를操作할 때, 이를 사용하지 않고도 두 개의 다른 클래스의 객체를操作할 수 있습니다. 하지만 이 프로그램은 매우 길고 복잡하며 이해하기 어렵습니다.

示例2:두 개의 다른 클래스의 멤버를 사용하여 프렌드 함수 추가

#include <iostream>
using namespace std;
// 전치 선언
class B;
class A {
    private:
      int numA;
    public:
      A(): numA(12) { }
      //친구 함수 선언
      friend int add(A, B);
};
class B {
    private:
       int numB;
    public:
       B(): numB(1) { }
       // 친구 함수 선언
       friend int add(A, B);
};
//add() 함수는 클래스 A와 B의 프렌드 함수입니다
//멤버 변수 numA와 numB에 접근
int add(A objectA, B objectB)
{
   return (objectA.numA + objectB.numB);
}
int main()
{
    A objectA;
    B objectB;
    cout << "합계: " << add(objectA, objectB);
    return 0;
}

출력 결과

합계: 13

이 프로그램에서는 클래스 A와 B가 add() 함수를 프렌드 함수로 선언했습니다. 따라서 이 함수는 이 두 클래스의 비공개 데이터에 접근할 수 있습니다.

여기서 add() 함수는 두 개의 객체 objectS와 object의 비공개 데이터 numA와 numB를 더하고, 이를 main 함수에 반환합니다.

为了使这个程序正常工作,应该像上面的实例中所示的那样,对一个类B进行前置声明。

这是因为使用以下代码在class A中引用了class B的友元函数:friend int add(A,B);

C ++编程中的友元类(friend class)

类似地,像一个友元函数一样,一个类也可以使用关键字friend成为另一个类的友元类。例如:

... .. ...
class B;
class A
{
   // class B 是 class A的友元类
   friend class B;
   ... .. ...
}
class B
{
   ... .. ...
}

当一个类成为另一个类的friend类(友元类)时,这就意味着这个类的所有成员函数都是另一个类的友元函数。

在这个程序中,B类的所有成员函数都是A类的朋友函数,因此B类的任何成员函数都可以访问A类的私有和受保护的数据,但是A类的成员函数不能访问B类的数据。

C ++编程中如何互为友元类

如何实现classA与B互为友元,即A可以访问B的私有,B也可以访问A的私有呢?案例如下:

#include <iostream>
using namespace std;
//必须提前声明class B不然编译会报错
class B;
class A{
private:
    int a;
public:
    friend class B;
    A(){
        cout << "类A被构造" << endl;
        a = 20;
    }
    ~A(){
        cout << "类A被析构" << endl;
    }
    void show(B &b);
};
class B{
private:
    int b;
public:
    friend class A;
    B(){
        cout << "类B的构造" << endl;
        b = 12;
    }
    ~B(){
        cout << "类B被析构" << endl;
    }
    void show(A &a){
        cout << "a=" << a.a;
        cout << " b=" << b << endl;
    }
};
//函数不能放在class A 中,不然会编译报错
void A::show(B &b){
    cout << "a=" << a;
    cout << " b=" << b.b << endl;
}
int main(){
    A a;
    B b;
    a.show(b);
    b.show(a);
    return 0;
}
실행 결과:
클래스 A가 생성됨
클래스 B의 생성
a=20 b=12
a=20 b=12
클래스 B가 소멸됨
클래스 A가 소멸됨

친구 클래스로서의 방법은 class A에서 friend class B;를 선언하고 class B에서 friend class A;를 선언하는 것입니다;

주의:클래스 A에서 클래스 B을 사용하는 부분은 클래스 B의 선언 후에 정의해야 하며, 클래스 A에서는 선언만 가능합니다. 예를 들어 왼쪽 클래스 A의 show 함수는 클래스 A에서 직접 정의할 수 없으며, 클래스 B의 선언 후에 정의해야 합니다.