2009-03-13 6 views
1

할당 연산자는 오버로딩 산술 연산자

T = & 연산자 (CONST의 & t)

로서 선언 될 수있다;

클래스에 있지만 산술 연산자를 그런 식으로 정의 할 수 없습니다. 친구 기능이 있어야합니다. 왜 그런지 모르겠다 고요? 설명해 주시겠습니까? 당신이 쓸 수 있도록

답변

2

그들은 이상적으로, 전역과 반드시 ​​친구가 될한다 : 1은 operator+가 구성원 인 경우가 적합를 슬로우, yourtype의 대상이 아닌

yourtype v = 1; 
yourtype w = 1 + v; 

, 때문에. 그러나 전역으로 설정하면 1을 yourtype으로 변환 한 다음 작업을 수행합니다. 친구로 만들어서 필요에 따라 yourtype의 멤버를 추출하고 조작하는 데 도움이됩니다. 예를 들면 다음과 같습니다. operator+= 멤버 함수를 구현하고 operator+ 구현에 사용할 수 있습니다.

2

나는 C++ FAQ Lite이 확실한 답을 줄 것이라고 생각합니다.

a + b
MyClass MyClass::operator + (const MyClass& t) const 
{ 
    MyClass ret(*this); 
    ret += t; 
    return ret; 
} 

정말 문법 설탕이다, 컴파일러는 a.operator+(b)로 확장됩니다 :

4

산술 연산자

그럼 당신은 다음과 같이 정의 할 수 있습니다 친구가 될 것이 필수가 아닙니다. 이전 샘플은 모든 개체가 MyClass 인스턴스이지만 다른 유형 (예 : 1 + a)으로 작동해야하는 경우 작동하지 않습니다. 작동하지 않습니다. 이는 친구를 사용하여 해결할 수 있습니다.

MyClass operator + (int i, const MyClass& t) 
{ 
    MyClass ret(i); 
    ret += t; 
    return ret; 
} 

+ 연산자의 왼쪽은 클래스가 아니거나 클래스이지만 그 정의에 연산자 +를 추가 할 수없는 경우이 작업을 수행해야합니다.

class A 
{ 
    A& operator+(int n); 
    // ... 
} 

int main() 
{ 
    A my_var; 
    int integer = 1; 
    A + integer; // compiles 
    integer + A // error: no function operator+(int, A) defined 
} 

가 컴파일되지 않습니다 :

0

문제는 당신이 뭔가를 할 경우이다. 해결 방법은 연산자 + (int, A)와 연산자 + (A, int)를 A. 의 친구로 정의하는 것입니다. 부스트 연산자 라이브러리는이 프로세스를 매우 쉽게 만듭니다.