▶ 인자 전달 방식
(1) 값에 의한 호출 (call by value)
- 함수가 호출되면 매개 변수가 스택에 생성
- 호출하는 코드에서 값을 넘겨줌
- 호출하는 코드에서 넘어온 값이 매개 변수에 복사됨
(2) 주소에 의한 호출 (call by address)
- 함수의 매개 변수는 포인터 타입
- 함수가 호출되면 포인터 타입의 매개 변수가 스택에 생성
- 호출하는 코드에서는 명시적으로 주소를 넘겨줌
(기본 타입 변수나 객체의 경우 주소 전달, 배열의 경우 배열의 이름)
- 호출하는 코드에서 넘어온 주소 값이 매개변수에 저장
▶ '값에 의한 호출' 로 객체 전달
▷ 함수를 호출하는 쪽에서 객체 전달
- 객체 이름만 사용
▷ 함수의 매개 변수 객체 생성
- 매개 변수 객체의 공간이 스택에 할당
- 호출하는 쪽의 객체가 매개 변수 객체에 그대로 복사됨
- 매개 변수 객체의 생성자는 호출되지 않음
▷ 함수 종료
- 매개 변수 객체의 소멸자 호출 (매개 변수 객체의 생성자 소멸자의 비대칭 실행 구조)
▷ '값에 의한 호출' 방식으로 increase(Circle c)함수가 호출되는 과정
▷ '값에 의한 호출'시 매개 변수의 생성자는 실행되지 않음
▷ 값에 의한 호출시 매개 변수 객체의 생성자 실행되지 않은 이유는?
- increase()함수의 매개 변수 c에 waffle 객체가 전달된 후, 만일 객체c의 생성자 Circle()이 실행된다면, 객체 c의 반지름(radius 멤버 변수)이 1로 초기화 되어, 전달 받은 원본 상태를 잃어버리게 된다. 이러한 이유로 매개변수 객체의 생성자는 실행하지않고 소멸자만 실행된다
▶ '주소에 의한 호출' 로 객체 전달
▷ 함수 호출시 객체의 주소만 전달
- 함수의 매개 변수는 객체에 대한 포인터 변수로 선언
- 함수 호출 시 생성자 소멸자가 실행되지 않는 구조
▷ '주소에 의한 호출'로 increase(Circle*p)함수가 호출되는 과정
▶ 객체 치환 및 객체 리턴
▷ 객체 치환
- 동일한 클래스 타입의 객체끼리 치환 가능
- 치환된 두 객체는 현재 내용물만 같을 뿐 독립적인 공간 유지
- 객체의 모든 데이터가 비트 단위로 복사
▷ 객체 리턴
- 객체의 복사본 리턴
예제) 객체 리턴
참고문헌: 황기태,[명품 C++ Programming] 생능출판(2017), 671P
'[C++]' 카테고리의 다른 글
[C++] 얕은 복사와 깊은 복사 (0) | 2022.10.23 |
---|---|
[C++] 참조 (0) | 2022.10.23 |
[C++] 문자열 (1) | 2022.10.15 |
[C++] this 포인터 (0) | 2022.10.14 |
[C++] 동적 메모리 할당 (0) | 2022.10.08 |
댓글