2013-10-25 2 views
2

오버로드 연산자 함수를 수행 할 때 일반적으로 성능상의 이유로 참조로 전달하는 것이 가장 좋습니다. 그러나 나는 값으로 객체를 전달할 때 여전히 동일한 효과를 갖는다는 것을 알았습니다. 값으로 전달해서는 안되며 연산자에 영향을주지 않습니까? 나는 당신이 두 개의 int 변수를 가지고 있고 그것들을 다른 함수에 넘겨줌으로써 그것들을 바꾸고 싶다면, 당신이 참조로 건네 주면 (또는 포인터를 건네 주면) 작동한다는 것을 안다. 방금 값을 전달하면 변수는 끝까지 변하지 않습니다. 클래스 객체를 전달할 때도 마찬가지입니까?오버로드 함수의 참조 대 값에 의한 객체 전달

예 :

Person Person::operator+(Person obj1){ 
    Person sum; 
    sum.age = this->age + obj1.age; 

    return sum; 
} 

내가 주를 가지고 할 경우 :

Person person1(14); 
Person person2(182); 
Person3 = person1 + person2; 
std::cout << person3.age << std::endl; 

그것은 않습니다 내가

Person Person::operator+(Person &obj1){ 
    Person sum; 
    sum.age = this->age + obj1.age; 

    return sum; 
} 

그래서 나는 일종의 생각했던 것처럼 같은 내가 언급 한 스왑 방식과 비슷하다. 스왑 함수에 값을 전달하면 변수의 원래 값은 변경되지 않습니다. 나는 reference 대신에 객체를 그냥 통과 시키면 실제로 변경되지 않을 것이라고 생각했다. 이제는 Person 클래스에서 연산자와 변수가 같은 클래스에 정의되어 있기 때문에 동일하지 않으므로 실제로 연산자에 과부하가 걸린다고 생각합니다.

+1

"하지만 값을 기준으로 개체를 전달할 때 여전히 동일한 효과가 있음을 알았습니다." - 무슨 효과? –

+0

어떤 효과가 있습니까? 예제를 추가하십시오. –

+0

"일반적으로 성능상의 이유로 참조로 전달하는 것이 가장 좋습니다." 요즘은 그 반대가 종종 있습니다. –

답변

0

당신이 정의한 operator + overloads는 age 값이 196 인 Person 객체를 반환합니다 (출력은 제외해야합니다). 어느 메소드도 건네받은 값을 변경하려고하지 않습니다 (암묵의 this 포인터를 개입시켜). 나는 아래의 각 메소드에서 직접 코멘트를 통해 설명하는 이유를 설명하려고 노력했다.

Person Person::operator+(Person &obj1){ 
    // We have access to Person1 via the implicit this pointer. 
    // We have access to Person2 by obj1. 

    Person sum; 

    // The next statement only reads from the 2 objects. 
    sum.age = this->age + obj1.age; 

    // New object returned without any side effects to Person1 or Person2. 
    return sum; 
} 

하면 다음과 같은 두 가지 방법 서명을 수정하여 자신이 증명할 수 :

Person Person::operator+(Person obj1) const 
Person Person::operator+(const Person &obj1) const 

를 두 번째 연산자 +에서

Person Person::operator+(Person obj1){ 

    // We have access to Person1 via the implicit this pointer. 
    // obj1 is a copy of Person2. Hence, we have no access to Person2. 

    Person sum; 

    // The next statement only reads from the 2 objects. 
    sum.age = this->age + obj1.age; 

    // New object returned without any side effects to Person1 or Person2. 
    return sum; 
} 

: 첫 번째 연산자 +에서

이제 두 방법 모두 추가되는 값을 수정할 수 없습니다.

스왑이 교체중인 개체를 수정해야하기 때문에 스왑이 작동하도록하려면 참조 또는 포인터로 전달해야하는 것과 관련하여 스왑 예제를 사용하는 것이 좋습니다. Person 예제에서 연산자 +는 두 개의 Person 객체를 추가 할 때 올바른 값을 가진 새로운 Person 객체 만 반환하면됩니다.

예를 들어, 첫 번째 방법과 달리 Person2를 복사하기 위해 오버 헤드를 건너 뛰기 때문에 const 참조를 전달하는 것이 좋습니다. 메서드의 본문에 전달 된 매개 변수를 복사해야하는 경우이 대답은 약간 변경됩니다. 그러나 여기 당신은하지 않습니다.

관련 문제