우리 모두는 클래스의 비공개 멤버는 클래스의 멤버 함수를 통해서만 액세스할 수 있고 클래스 외부에서는 액세스할 수 없다는 것을 알고 있습니다. 이는 C++의 가장 기본적인 장점인 C++ 클래스 디자인의 캡슐화 및 은폐 아이디어를 반영합니다.
그러나 가끔 우리가 클래스 외부에서 이러한 private 멤버에 정말로 접근하고 싶다면 훨씬 더 번거로운 일이 될 것이며, 접근할 수도 없고 public 유형으로 선언할 수도 없는 딜레마에 빠지게 될 것입니다.
친구의 출현은 이 문제를 매우 잘 해결할 수 있습니다. 즉, 외부 기능을 친구 유형 으로 선언하고 클래스 내 비공개 멤버에 액세스할 수 있는 권한을 부여함으로써 두 가지 장점을 모두 얻을 수 있습니다. 이것은 우정의 의미이기도 합니다. 문자 그대로의 의미에서도 알 수 있습니다. "친구"처럼 녹색 채널을 엽니다.
친구 개체는 전역 일반 함수일 수도 있고 다른 클래스의 멤버 함수일 수도 있습니다. 그뿐만 아니라, 친구는 친구 클래스 라고 불리는 클래스일 수도 있습니다.
친구의 의미와 기능을 이해한 후, C++에서 어떻게 사용하는지 살펴보겠습니다. 친구 함수의 경우 클래스 내에서 함수를 선언하고 그 앞에 친구 키워드를 추가하기만 하면 됩니다. 이 기능은 고유한 권한을 가지며 친구 기능이 됩니다.
마지막으로 주목해야 할 점은 친구 기능이든 친구 클래스이든 관계없이 친구는 클래스 자체에 속하지 않는다는 것입니다. 아버지의 친구가 반드시 아들의 친구가 아닌 것처럼 클래스 내에서 this 포인터를 사용할 수도 상속될 수도 없습니다.
다음으로 두 점 사이의 거리를 구하는 프로그램을 작성합니다.
#include<iostream>#include<math.h>usingnamespacestd;classPoint{private:doublex;doubley;public:Point(doublea,doubleb){x=a;y=b;}intGetPoint(){cout<<(<< x<<,<<y<<);return0;}frienddoubleDistance(Point&a,Point&b);};//두 점 사이의 거리를 구합니다. doubleDistance(Point&a,Point&b){doublexx;doubleyy;xx=ax-bx;yy = ay-by;returnsqrt(xx*xx+yy*yy);}intmain(){PointA(2.0,3.0);PointB(1.0,2.0);doubledis;dis=거리(A,B);cout<<dis < <endl;return0;}
두 점 사이의 거리를 구현하는 함수는 외부 일반 함수임을 알 수 있습니다. 클래스의 전용 멤버에 액세스해야 하므로 클래스에서 튀긴 친구 유형으로 선언합니다. Point 클래스의 마지막 줄을 참조하세요. . 이때 코드는 문제 없이 컴파일되며 일반적인 출력은 다음과 같습니다.
테스트 결과는 컴퓨터에서 직접 실험해볼 수 있습니다. 친구 유형으로 선언하지 말고 오류 결과를 관찰해 보세요.