2009-09-03 3 views
3

예의 경우 Friend Functions
다음 내용은 어떻게 적용됩니까?친구 기능

"duplicate() 선언이나 나중의 main()에서의 사용에서 우리는 CRectangle 클래스의 멤버 중복을 고려하지 않았습니다. 회원이되고있다. "

중복은 CRectangle의 공개 섹션에서 선언됩니다. 그것은 어떻게 멤버 함수가 아니며 set_values는 무엇입니까?

이것은 좋은 예입니까? 그렇지 않다면 더 좋은 것들?

답변

9

클래스 내에 friend으로 선언되거나 정의 된 모든 함수는 해당 클래스의 멤버가 아닙니다. 그것은 단지 친구 기능입니다.

친구 함수도 클래스 내에서 정의 된 경우 해당 클래스 (일반적으로 오버로드 된 연산자에 사용됨)와 관련된 ADL 조회에 의해 발견됩니다.

10

Pavel의 대답은 귀하의 질문에 대한 직접적인 답변이지만, 친구 기능이 어떤 용도로 사용되는지 확실하지 않을 수 있으므로 일반적인 예를 들려 줄 것입니다.

friend 함수의 일반적인 사용은 특정 연산자가 개체의 개인 멤버에 액세스해야하거나 액세스가 필요한 스트림 연산자를 오버로드하는 것입니다. 즉 : 친구 기능을 쓸 필요없이 우리가 인쇄를 위해 개인 데이터에 액세스 할 수 있습니다이 경우

class Rectangle 
{ 
... 
    friend ostream &operator<<(ostream &stream, Rectangle r); 
private: 
    int width; 
    int height; 
}; 

friend ostream &operator<<(ostream &stream, Rectangle r) 
{ 
    return (stream << "{" << width << ", " << height << "}"); 
} 

데이터에 대한 방법을 '수'. 아마 이것은 친구 기능이 사용되는 이유를 명확히하는 데 도움이 될 것입니다.

+2

좋은 답변이며 '친구 연산자 <<'는 완전히'사각형 '내부에 정의 될 수도 있습니다 (즉, 본문과 함께 완성 됨 - 의미가 동일하게 유지됨). –

+0

큰 클래스 인 경우 더 효율적인 'Rectangle & r' 사용을 고려하십시오. 또는 'const Rectangle & r'을 사용하면 "const Rectangle"(어쩌면 클래스의 사용자 정의 상수)를 인쇄 할 수 있습니다. – Niing

1

답변은 클래스의 함수 선언 바로 전에 friend 키워드에 있습니다.

친구 CRectangle duplicate (CRectangle);

friend 함수는 private 멤버 변수 클래스에 대한 액세스를 허용하는 함수입니다. 이 클래스에 속한 멤버 함수는 아닙니다.

set_values는 친구 키워드가없고 클래스 정의 내에 범위가 있기 때문에 해당 클래스의 멤버입니다. 메소드 본문은 클래스 정의 외부에 정의됩니다. 즉, 클래스는 앞으로의 구현에 대한 포워드 정의와 같습니다 (아래 참조).

메서드 이름 앞에 CRectangle ::을 붙임으로써 CRectangle 클래스의 범위 내에서 선언 된 set_values ​​함수의 구현임을 컴파일러에 알리는 것입니다.

친구가 유용 할 수있는 곳에 대한 DeusAduro의 대답은 친구 수업의 매우 일반적인 용도입니다.

1

그래, 나도 이것에 균열 걸릴거야.

모두가 지적했듯이 멤버 함수 선언과 friend 함수의 구문상의 차이는 적절하게는 friend 키워드입니다.

여기에 대해 생각하는 한 가지 방법이 있습니다. 멤버 함수는 암시 적 매개 변수 인 객체 자체에 대한 포인터를가집니다. E. g.set_values 안에 widthheight 멤버를 사용할 수 있으며 이들은 set_values이 호출 된 개체의 멤버가됩니다.

다른 한편으로는 멤버 함수가 아니기 때문에, 당신은 duplicate() 내부에서 스스로 식별자 width 또는 height를 사용할 수 없으며, 따라서, 난을 암시 매개 변수가 없습니다. 이자형. 특정 개체와 관련이 없습니다. 우정이 의미하는 바는 duplicate()이 전달 된 CRectangle 개체의 개인 구성원이나 해당 범위 내의 로컬 변수에 액세스 할 수 있다는 것입니다.

또 다른 포인트 : 친구 선언은 실제로 기능 선언이 아닙니다. 이 특정 함수가 정의되면이 클래스의 private 멤버에 대한 액세스 권한이 부여된다는 것은 컴파일러에 대한 메모 일뿐입니다.

+1

그러나 정적 멤버 함수는 암시 적 매개 변수가 없더라도 멤버 함수입니다. 또한 friend 선언은 함수를 선언하지 않지만 friend _inline 정의 _는 함수를 선언하고 정의하며 (또한 friend로 만듭니다). –

+0

아, 지금은 정말 흥미로워지고 있습니다. :) 멤버 함수 : 암시적인 매개 변수가 있고 개인 정적 멤버 및 비 정적 멤버에 액세스 할 수 있습니다. 정적 멤버 함수 : 암시 적 매개 변수가없고 정적 데이터 멤버에만 액세스 할 수 있습니다. Friend 함수 : 암시 적 매개 변수가 없으며 개인 정적 멤버 및 비 정적 멤버에 액세스 할 수 있습니다. 그건 그렇고 인라인 친구 기능에 대한 중요한 포인트. – Dima