2010-12-06 3 views
7

수업의 멤버 기능을 자신의 친구로 만들면 어떻게됩니까?회원 기능을 친구로 만들기

아래의 코드는 컴파일되어 실행됩니다. 친구 선언없이 '연산자에 대한 인수가 너무 많습니다.'가 생성됩니다 (맞습니다). 이 일을하는 것이 의미가 없지만 누군가 여기서 일어나는 일을 말해 줄 수 있습니까? 친구는 어떤면에서이 매개 변수의 기본값을 생략하도록 컴파일러에 지시합니까?

당신이 클래스의 멤버 함수 자체의 친구를 할 때 어떻게됩니까
class Test 
{ 
public: 
    friend bool operator<(Test& lhs, Test& rhs) 
    { 
    return true; 
    } 
}; 

int main(int c, char** argv) 
{ 
    Test test1; 
    Test test2; 

    return test1 < test2; 
} 
+1

당신의 질문에 답하기 위해서 : 친구들은 C++ 03에서 befriending 클래스의 멤버가 될 수 없지만 C++ 0x에서는 허용됩니다. –

+0

궁금한데, 회원 기능이 이미 완전한 액세스 권한을 갖고 있기 때문에 회원 기능을 자신의 친구로 허용하는 것이 가능한 점은 무엇입니까? – radman

+0

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#77 또는 기록을 참조하십시오. 중첩 된 클래스는 C++ 0x 및 대부분의 C++ 03 컴파일러에서 중첩 클래스). –

답변

9

의 차이는 친구가 전체 정의는 클래스 내부에 나타나는 경우에도 회원이되지 않는 것입니다; 오히려 함수는 주변 네임 스페이스에 배치됩니다. 따라서 this 포인터가 없습니다. 멤버 operator<이 암시 적으로 this 및 명시적인 오른쪽 인수에서 작동하는 동안 friend에는 함수 매개 변수로 명시 적으로 제공되는 왼쪽 및 오른쪽 인수가 필요하므로 추가 매개 변수가 필요합니다. friend 버전은 클래스 다음에 함수를 넣는 것과 같습니다. 단, privateprotected 멤버 및베이스에 액세스 할 수 있으며 암시 적으로 inline입니다 (컴파일러가 인라인해야 함을 의미하지는 않지만 힌트 일 뿐이지 만 friend 함수가 많은 번역 단위에서 포함되어 문제없이 링크 될 수 있다는 점에서 One Definition Rule과 관련하여 중요합니다.

1

!?

그건 의미가 없습니다. 클래스의 구성원 함수이 같은 클래스의 친구 일 수 있습니까?

operator <을 (회원 기능이 아닌) 친구 기능으로 오버로드했습니다. 클래스 내부에 friend 함수의 정의 (본문)를 제공하는 것은 합법적입니다. 그러나 그것의 정의 내 this를 사용하는 것은 불법입니다

friend bool operator<(Test& lhs, Test& rhs) 
{ 
    *this ; //error 
    return true; 
}