+ 연산과 = 대입연산 사이에서 호출되는 생성자 함수가 문제일까요?
요 아래
operator= 연산자와 operator+ 연산자
라는 제목으로 글을 올린 적이 있는데, 질문이 장황한 것 같아서 다시 정리해 글을 올립니다.
클래스에서 operator+ 연산자와 operator= 연산자를 오버로딩했습니다. 그리고 연산의 대상은 해당 클래스의 객체입니다.
operator+ 연산의 결과는 해당 클래스로 선언된 지역변수에 저장되어 반환됩니다.
그런데 만약 다음과 같이 연속적인 연산을 한다고 하면,
C=A+B;
A+B의 반환된 결과는 operator= 연산자 함수의 오른쪽 항 값이 됩니다. operator= 함수의 매개변수는 A+B의 결과인 객체를 인수로 받을 수 있는 언급된 클래스의 타입입니다. 이 때 복사생성자가 호출됩니다. 복사생성자를 정의하지 않았다면 기본복사생성자가 호출될 겁니다. 그런데 문제는 전달되는 매개변수인 객체의 속성 중에 포인터가 존재한다면 깊은 복사를 해야 합니다. 그래서 생성자를 만들었습니다. 클래스 이름은 Array이고요. 앞에서 언급된 클래스도 모두 Array입니다. 그 생성자의 원형은 다음과 같습니다.
Array(Array& src);
그런데 문제는 복사생성자의 매개변수가 위처럼 참조형태여야 한다는 것입니다. 그러나 참조형태로 복사생성자를 만들게 되면 operator+ 의 반환결과, 즉 A+B의 결과를 Array(Array& src)의 src가 참조할 수 없습니다. 그 이유는 operator+에서 반환되는 결과는 operator+ 함수의 지역변수이기 때문입니다.
생성자 Array(Array& src)가 operator+의 반환결과를 제대로 참조하려면 operator+ 함수, Array(Array& src) 생성자, operator= 함수의 원형을 어떤 식으로 만들어야 할까요? 요 몇일째 해결이 안되네요.
생성자와 operator=의 인자에 const를
생성자와 operator=의 인자에 const를 붙여주시면 될 것 같습니다.
const를 안 붙이면 임시 객체를 못 받습니다. (임시 객체는 rvalue이기 때문입니다.)
/*** Signature ******************
* blog: http://blog.bluekyu.me/ *
********************************/
정말 감사합니다.
생성자의 문제가 아니였네요. 언급하신 부분 중에
Array& operator=(const Array& src);
이렇게 수정하니 질문드린 문제가 해결됩니다. 정말 감사합니다. 몇일째 체증이 다 날아간 듯 합니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
댓글 달기