2017-01-10 1 views
-1

아래에 약간의 샘플 코드를 작성했습니다.C++에서 코드 예제는 종종 연산자 오버로딩시 메모리 위치를 사용합니까?

#include <iostream> 
#include <cstdio> 

using namespace std; 
class Box{ 
    int l; //length 
    int b; //breadth 
    int h; //height 
public: 
    Box(){ l =0; b = 0; h = 0;} 
    Box(int d1, int d2, int d3){ l = d1;b=d2;h=d3;} 
    int getLength(){return l;} 
    friend Box operator+(Box b1, Box b2){ 
     Box tempBox; 
     tempBox.l = b1.l + b2.l; 
     tempBox.b = b1.b + b2.b; 
     tempBox.h = b1.h + b2.h; 
     return tempBox; 
    } 
    int calculateVolume(){ return l * b * h;} 
}; 

이 코드는 컴파일/실행시 오류가 발생하지 않습니다. 친구 기능을 다음과 같이 변경할 수도 있습니다.

friend Box operator+(Box &b1, Box &b2){ 
    Box tempBox; 
    tempBox.l = b1.l + b2.l; 
    tempBox.b = b1.b + b2.b; 
    tempBox.h = b1.h + b2.h; 
    return tempBox; 

테스트 코드도 동일하게 실행됩니다. 내 질문에, 친구 함수의 두 번째 버전 (예 : 샘플 코드에서 자주 볼 수있는)과 같은 메모리 주소로 Box 객체 'b1'및 'b2'를 참조하는 목적은 무엇입니까? 더 중요한 것은 friend 함수에 주소를 전달할 때 어떤 역 참조를하지 않고도 해당 주소에 저장된 객체를 조작하는 것을 어떻게 알 수 있습니까? 죄송합니다. 저는이 모든 것에 조금 새로운 것 같습니다. 어떤 도움을 주시면 감사하겠습니다!

+3

C++ 기본 사항을 배워야합니다. '&'는 값으로 호출하는 대신 참조하여 호출하는 것을 의미합니다. – stark

+0

좋은 책을 얻고 C++ 참고 자료를 읽어보십시오. 귀하의 첫 번째 예제와 두 번째 예제는 비슷하게 보이지만 그 밑에는 사납게 다른 것들을하고 있습니다. 참조 자료로 일부 통과하십시오. –

+0

@ 벤 : "야생"이 아닙니다. 사실 어셈블리 생성이 다소 많아 지거나, 모두가 말했고 완료되었을 때 나는 놀라지 않을 것입니다. 3 개의 불필요한 정수 사본은 쉽게 삭제할 수 있습니다. –

답변

0

박스 객체 'B1'과 무슨 일이 일어나고되지 않은 것을 두 번째 버전

처럼 자신의 메모리 주소로 'B2'를 참조. "address-of operator"모양의 &은 여기에서 사용되지 않습니다. 기술적으로 차이가 문맥보다는 공백 위치에 자리 잡고 있지만 다음과 같이

, 우리는 더 명확하게 코드를 작성할 수 있습니다

friend Box operator+(Box& b1, Box& b2){ 

Box&는 유형 "Box을 참조하여"입니다.

참조는 불필요한 복사를 방지합니다. 자세한 내용은 참고 문헌에 대한 책의 장을 읽으십시오.

+0

고마워요! 매우 감사. – Gimingo