# 호출 방식에 따른 매개변수 전달
# call by value(값에 의한 호출)
|
|
# call by reference(주소에 의한 호출)
|
|
# 객체 전달 방식에 따른 함수 호출
# “값에 의한 호출"로 객체 전달
|
|
# “주소에 의한 호출"로 객체 전달
객체 포인터를 이용하여 객체 주소를 전달
|
|
예제 : Circle객체 y를 x에 더하여 x를 키우고자 한다. increaseBy() 라는 함수를 전역으로 작성하여 기능을 완성하시오.
|
|
# 객체 치환 및 객체 리턴
객체 치환
- 동일한 클래스 타입의 객체끼리 치환가능
- 객체의 모든 데이터가 비트 단위로 복사
- 치환된 두 객체는 현재 내용물만 같을 뿐 독립적인 공간 유지
객체 리턴
|
|
# 참조와 함수 (reference, 참조자)
이름을 지니는 공간에 별칭을 부여하는 것
자료형 &레퍼런스명 = 대상; 형태로 선언
|
|
|
|
# 정리
call by value
- 객체 값에 의해 전달
- 생성자 매개변수 객체 생성 시 호출되지 않음
- 외부에서 값 변경 x
call by reference
- 포인터를 이용한 call by reference
객체의 주소를 전달
객체의 포인터가 매개변수이므로 생성자, 소멸자와 상관없음
외부에서 값 변경 o - 참조자를 이용한 call by reference
# 복사 생성자
생성자(constructor) : 객체 생성시 반드시 한번 호출되는 함수
복사 생성자(copy constructor) : 기존의 객체를 복사해서 새로운 객체를 생성할 때 호출되는 특별한 생성자
중요! 참조자를 매개변수로 받아야함.
객체를 매개변수로 받을 때 계속 객체를 생성하며 무한루프에 빠지게 된다.
default 복사 생성자가 존재(기존의 멤버 변수를 복사해준다)
특징
- 한 클래스에 오직 한 개만 선언 가능
- 복사 생성자는 보통 생성자와 클래스 내에 중복 선언 가능
- 모양 : 클래스에 대한 참조 매개변수를 가지는 독특한 생성자
|
|
# 얕은 복사와 깊은 복사
얕은 복사(shallow copy)
- 객체 복사 시, 객체의 멤버를 1:1로 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우
-> 사본은 원본 객체가 할당 받은 메모리를 공유하는 문제 발생(동적할당 해제 시 메모리 참조 오류 발생)
깊은 복사(deep copy)
- 객체 복사 시, 객체의 멤버를 1:1대로 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우
- 사본은 원본이 가진 메모리 크기 만큼 별도로 동적 할당
- 원본의 동적 메모리에 있는 내용을 사본에 복사 - 완전한 형태의 복사
- 사본과 원본은 메모리를 공유하는 문제 없음
기존의 객체가 동적할당된 공간의 주소값을 가지는 경우 » 반드시 깊은 복사를 하는 복사생성자를 구현해야함. 얕은 복사를 하는 default 복사 생성자로는 에러가 발생(메모리 참조 오류)
# 예제
예제 1
|
|
예제 2
|
|