Kong Eunho

함수와 참조, 복사 생성자

2025년 10월 22일 15시
카테고리 - LECTURE, 객체지향프로그래밍II


객체지향프로그래밍II(김정준) 중간고사 대비 (5장)

함수의 인자 전달 방식

void swap(int a, int b) { ... } // call by value
...
swap(m, n);
void swap(int *a, int *b) { ... } // call by address
...
swap(&m, &n);

값에 의한 호출로 객체 전달

void increase(Circle c) {
  c.setRadius(c.getRadius() + 1); // 원본의 값 변경 X
} // 소멸자 호출 O
...
Circle donut(30);
increase(donut); // call by value, 생성자 호출 X

주소에 의한 호출로 객체 전달

void increase(Circle *p) {
  p->setRadius(p->getRadius() + 1); // 원본의 값 변경
} // 소멸자 호출 X
...
Circle donut(30);
increase(&donut); // call by address, 생성자 호출 X

객체 치환과 객체 반환

Circle c1(5);
Circle c2(30);
c1 = c2; // c2 객체를 c1 객체에 비트 단위 복사. c1의 반지름 30
Circle getCircle() {
  Circle tmp(30);
  return tmp; // tmp 객체의 복사본 반환 (객체 반환)
}
...
Circle c; // c의 반지름 1
c = getCircle(); // tmp 객체의 복사본이 c에 치환. c의 반지름은 30이 됨


참조 변수

int n = 2;
int &refn = n; // 참조 변수 refn 선언. refn은 n에 대한 별명

Circle donut;
Circle &refc = donut; // 참조 변수 refc 선언. refc는 donut에 대한 별명
int n = 2;
int &refn = n;
int *p = &refn; // 참조에 대한 포인터 변수 선언
int *p = &n // 동일한 선언


참조에 의한 호출

void swap(int &a, int &b) { ... } // call by reference
...
swap(m, n);


참조 매개 변수가 필요한 사례

참조 리턴

char& find(char s[], int index) {
  return s[index]; // 참조 리턴
}
...
char name[] = "Mike";
find(name, 0) = 'S'; // name[0]을 'S'로 변경. name == "Sike"

얕은 복사와 깊은 복사

복사 생성자

class Circle {
  ...
  Circle(const Circle& c); // 복사 생성자 선언
};
...
Circle::Circle(const Circle& c) { // 복사 생성자 구현
  this->radius = c.radius;
}
...
Circle src(30);
Circle dest(src); // 복사 생성자 호츨, dest의 radius == 30


디폴트 복사 생성자 (얕은 복사 생성자)


깊은 복사 생성자


복사 생성자가 자동으로 호출되는 사례

void f(Person person) { // 1. 값에 의한 호출로 객체 전달
  person.changeName("dummy");
}

Person g() {
  Person mother(2, "Jane");
  return mother; // 2. 객체 리턴
}

int main() {
  Person father(1, "Kitae");
  Person son = father; // 3. 객체 생성 시 객체로 초기화
  f(father);
  g();
}
  1. 값에 의한 호출로 객체 전달
    별도의 공간이 할당되기 때문에 person 객체의 복사 생성자 호출
  2. 객체 리턴
    객체 리턴 시 사본으로 리턴하기 때문에 mother 객체의 복사 생성자 호출
  3. 객체 생성 시 객체로 초기화
    son 객체의 복사 생성자 호출
◀ 이전 글 LECTURE, 객체지향프로그래밍II
객체 포인터와 객체 배열, 객체의 동적 생성
2025-10-22
목록으로 다음 글 ▶ LECTURE, 객체지향프로그래밍II
함수 중복과 static 멤버
2025-10-22