c++ call by reference에 대해
글쓴이: kjw9122 / 작성시간: 일, 2016/01/03 - 12:28오전
class person { private: int age; public: person(int age) { this->age = age; } int getAge() { return age; } }; void main() { person* a = new person(20); person* b = new person(10); cout << "before : " << a->getAge() << b->getAge() << endl; swap(a, b); cout << "after : " << a->getAge() << b->getAge() << endl; } void swap(person* c, person* d) { person* temp = c; c = d; d = temp; }
결과값
before : 2010
after : 1020
위와 같은 소스코드에서요. 결과값을 보면 위와같이 의도한데로 swap 함수가 제대로 동작합니다.
근데 main에서 person 포인터변수 a와 b가 가리키고 있는 객체의 주소를 swap함수를 호출할 때 매개변수로 넘겨주고
swap과정을 거치게 되면 swap함수 내부에 있는 지역변수인 c, d 사이에서만 객체의 주소값이 바뀌고
swap함수가 종료되고 다시 main으로 돌아오면 main의 지역변수 a, b는 그대로 원래의 주소값을 지니고 있어야 하는거 아닌가요?
결과를 보게되면 swap함수 내부 지역변수 사이에서 주소값이 바뀐게 main의 지역변수 a,b에도 영향을 주는데
이게 왜 swap이 되는지 이해가 안되네요.
Forums:
gilgil.net
> 결과를 보게되면 swap함수 내부 지역변수 사이에서 주소값이 바뀐게 main의 지역변수 a,b에도 영향을 주는데
swap 함수가 호출이 되고 나면 main에서 a, b의 주소값이 바뀌는 게 아니고 내용이 바뀌는 겁니다.
www.gilgil.net
말씀해주신 부분 확인해봤는데..
main 함수에서 포인터 a,b 출력해본 결과로는 주소값이 바뀌네요.
before : 20, 10
before : 00A3D318, 00A381C0
after : 10, 20
after : 00A381C0, 00A3D318
또한 말씀해주신데로 값이 바뀌는것 역시 swap에서 temp = c, c = d, d = temp 모두 주소값에 대한 대입이 이루어지는데.. 논리적으로 이해가안되네요.
코드가 좀 이상한 듯
main 앞에 swap이 선언이 안 되어 있나요? 왠지 main에서 저 코드의 swap을 부르는 게 아니라 std::swap을 부르고 있는 게 아닌가 싶은데요.
swap 함수 안에 "swap 불렸음!"이라고 출력하는 코드를 넣은 다음에 정말로 불리는지 확인해 보세요.
gilgil.net
에구, 에구 그렇네요. 제가 코드를 잘못 해석한 듯.
swap function이 forward declaration이 안되어 있으면 컴파일러는 move.h 안에 있는 template function을 이용하는군요.
ps: 영훈이 잘 지내남? 새해 복 많이 받아라. ^^
www.gilgil.net
의견
1. 참고로 지금 구현하신 swap에는 문제가 있습니다.
이렇게 구현하시면 지역 변수인 c, d, temp의 값만 바뀌고 main 쪽의 지역 변수인 a, b의 값은 전혀 바뀌지 않습니다.
인자에 &를 붙여 reference를 만들거나, double pointer를 사용하시고 * 연산자를 사용하셔야 합니다.
저는 이렇게 생각했습니다.
HDNua 님이 정답인 것 같구요. swap은
HDNua 님이 정답인 것 같구요. swap은 왠만하면 std::swap 이용하는게 좋습니다.
예외인 경우는 객체가
imple paternpimple patern으로 구현됐을때 정도...겠지요.댓글 달기