English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서는 C ++에서 친구 함수와 친구 클래스를 생성하고 프로그램에서 효과적으로 사용하는 방법을 배웁니다.
OOP중요한 개념 중 하나는 데이터 숨기기입니다. 즉,비회원 함수객체의 비공개 또는 보호된 데이터에 접근할 수 없습니다.
하지만, 때로는 이러한 제한이 프로그래머가 긴장하고 복잡한 코드를 작성하게 만들 수 있습니다. 따라서 C ++프로그래밍은 비회원 함수에서 비공개 또는 보호된 데이터에 접근할 수 있는 메커니즘을 제공합니다.
친구 함수와 친구 클래스를 사용하여 완료됩니다.
함수를 친구 함수로 정의하면,함수클래스의 비공개 데이터와 보호된 데이터에 접근할 수 있습니다.
키워드를 사용하여friend, 컴파일러는 주어진 함수가 친구 함수임을 알고 있습니다.
데이터에 접근하려면, 클래스 내부에서 키워드 friend로 시작하는 친구 함수를 선언해야 합니다(클래스 내부의 어느 곳에서든, private 부분이든 public 부분이든).
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의 프렌드 함수라면 ... .. ... }
/* 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 클래스에서 선언되었습니다. 따라서 이 함수에서 비공개 데이터에 접근할 수 있습니다.
이 예제는 프렌드 함수 개념에 대한 아이디어를 제공했지만, 의미 있는 사용법을 보여주지 않았습니다.
두 개의 다른 클래스의 객체에 대한操作이 필요할 때, 더 의미 있는 사용법이 있습니다. 그때, 프렌드 함수는 매우 유용합니다.
두 개의 다른 클래스의 객체를操作할 때, 이를 사용하지 않고도 두 개의 다른 클래스의 객체를操作할 수 있습니다. 하지만 이 프로그램은 매우 길고 복잡하며 이해하기 어렵습니다.
#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);
类似地,像一个友元函数一样,一个类也可以使用关键字friend成为另一个类的友元类。例如:
... .. ... class B; class A { // class B 是 class A的友元类 friend class B; ... .. ... } class B { ... .. ... }
当一个类成为另一个类的friend类(友元类)时,这就意味着这个类的所有成员函数都是另一个类的友元函数。
在这个程序中,B类的所有成员函数都是A类的朋友函数,因此B类的任何成员函数都可以访问A类的私有和受保护的数据,但是A类的成员函数不能访问B类的数据。
如何实现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의 선언 후에 정의해야 합니다.