Kong Eunho

C++ 함수와 참조, 복사 생성자

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


객체지향프로그래밍II(김정준) 3주차 강의내용

함수의 인자 전달 방식

‘값에 의한 호출’로 객체 전달

함수에 객체 전달 – ‘주소에 의한 호출’로

객체 치환 및 객체 리턴

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 circle;
Circle &refc = circle; // 참조 변수 refc 선언. refc는 circle에 대한 별명

참조에 의한 호출

포인터와의 내부 기능적 차이

참조 매개변수가 필요한 사례
다음 코드에 어떤 문제가 있을까?

bool average(int a[], int size, int& avg) {
   if(size <= 0)
      return false;
   int sum = 0;
   for(int i=0; i<size; i++)
      sum += a[i];
   avg = sum/size;
   return true;
}

int main() {
   int x[] = {0,1,2,3,4,5};
   int avg;
   if(average(x, 6, avg)) cout << "평균은 " << avg << endl;
   else cout << "매개 변수 오류" << endl;

   if(average(x, -2, avg)) cout << "평균은 " << avg << endl;
   else cout << "매개 변수 오류 " << endl;
}

참조 리턴

char c = 'a';

char& find() { // char 타입의 참조 리턴
   return c; // 변수 c에 대한 참조 리턴
}

char a = find(); // a = 'a'가 됨

char &ref = find(); // ref는 c에 대한 참조
ref = 'M'; // c= 'M'

find() = 'b'; // c = 'b'가 됨


C++에서 얕은 복사와 깊은 복사

복사 생성자

class Circle {
   ............
   Circle(const Circle& c); // 복사 생성자 선언
   ............
};

Circle::Circle(const Circle& c) { // 복사 생성자 구현
   ............
}

디폴트 복사 생성자

Circle::Circle(const Circle& c) {
   this->radius = c.radius;
   // 원본 객체 c의 각 멤버를 사본(this)에 복사한다.
}

얕은 복사 생성자가 오류를 발생시키는 사례

◀ 이전 글 LECTURE, 인공지능개론
인공지능 응용과 연구 - 2, 규칙기반
2025-09-16
목록으로 다음 글 ▶ LECTURE, 인공지능개론
탐색 1
2025-09-23