2012-01-19 4 views
0

클래스 내부에 연산자 함수를 정의하면 클래스 내부에 연산자 함수를 정의한 다음 해당 함수가 클래스에 속하지 않습니다.C++ 클래스, 친구 연산자와 외부 연산자의 차이점

그러나 그 기능이 클래스 외부에 있고 클래스 내에서 친구로 선언했지만 정의하지 않은 경우에도 동일한 작업이 수행됩니다. 한 클래스의 내부이고

두 동일한 오퍼레이터 정의가이 코드를 있다고 여기는 클래스 ouside 다른 :

버전 1

class MyClass 
{ 
    // version 1 inside a class 
    friend MyClass&& operator +(MyClass& a, MyClass& b) 
    { 
     return move(MyClass(a.x + b.x, a.y + b.y)); 
    } 
    int x,y; 

public: 
    MyClass() {} 
    MyClass(int,int){} 
}; 

int main() 
{ 
    MyClass a, b, c; 
    c = a + b; 
    cin.ignore(); 
    return 0; 
} 

버전 2 (a 클래스의 내부) (수업 외)

class MyClass 
{ 
     friend MyClass&& operator +(MyClass& a, MyClass& b); 
    int x,y; 

public: 
    MyClass() {} 
    MyClass(int,int){} 
}; 

MyClass&& operator +(MyClass& a, MyClass& b) 
{ 
    return move(MyClass(a.x + b.x, a.y + b.y)); 
} 

int main() 
{ 
    MyClass a, b, c; 
    c = a + b; 
    cin.ignore(); 
    return 0; 
} 

무엇이 다른가요? 그 두 접근법?

+0

rvalue 참조로 이동하고 반환하는 것은 의미가 없습니다. –

+0

는 RValue에 의해 반환되지 않고 값으로 반환됩니다. – codekiddy

+0

의미가 없지만 잘못되었습니다. 참조로 로컬 또는 임시를 리턴하는 것은 정의되지 않은 동작입니다. –

답변

1

지금은 MyClass&& operator +(MyClass& a, MyClass& b)을 두 번째 코드 단편에 두 번 정의하고 있습니다. 두 번째 정의를 제거하면 두 개는 의미 상 동일합니다.

두 가지는 똑같이 할 것입니다. 어떤 경우에는 다른 쪽보다 선호하는 경우가 있습니다 (예를 들어, 두 번째 파일은 cpp 파일에 배치 될 수 있고 첫 번째 파일은 템플리트를 사용하는 것이 더 자연 스럽습니다).

첫 번째는 암시 적으로 인라인으로 표시되고 두 번째는 인라인되지 않습니다. 하나 inline 두하지만

(당신은하지만, const를 참조 MyClass을 통과해야합니다.)

+0

오, 감사합니다. 나는 첫 번째 스 니펫을 수정했습니다. 그래서이 두 조각은 이제 수정 될 때 완전 동일합니다. – codekiddy

+0

@codekiddy : 변경 사항을 반영하도록 업데이트되었습니다. –

+0

오, 그래, 템플릿 및 인라인 만들기. 감사! – codekiddy

4

를 귀하의 경우에는, 두 버전은 같은 일 (정의되지 않은 동작을 일으키는, 실제로 매달려 참조를 반환)을 할 그렇지 않습니다.

일반적으로 본문이 클래스 내에 정의 된 friend 함수는 자격이없는 클래스 멤버를 사용할 수도 있습니다 (friend 함수에 this 포인터가 없으므로 기본 클래스에있는 정적 멤버가 될 수 있습니다).

여기 표준의 관련 텍스트입니다 (섹션 11.3 [class.friend]) :

와 클래스가 로컬이 아닌 클래스 인 경우에만 경우 기능이 드 Fi를 클래스의 친구 선언에 네드 할 수있다 (9.8) , 함수 이름은 정규화되지 않았으며 함수의 이름 공간 범위가 있습니다.

이러한 함수는 암시 적으로 inline입니다. 클래스에 정의 된 friend 함수는 그것이 정의 된 클래스의 (어휘) 범위 내에 있습니다. 클래스 외부에 정의 된 friend 함수는 (3.4.1)이 아닙니다.