10. 복사 생성자 (copy constructor) 문제 풀어보기 #1

2021. 12. 2. 02:06c++/기초

 
각 객체의 고유한 시리얼 넘버를 생성하는 기본 생성자를 가지고 있는 numbered라는 클래스가 있다고 가정하자.
(mysn라는 멤버에 저장됨)
  1. numbered 클래스는  합성된 copy-control member 그리고 주어진 아래의 함수를 사용한다.
 
void f (numbered s) { cout <<  s.mysn  << endl ; }
 
아래 코드를 실행 했을 때 어떤 결과가 나옵니까?
 
number a, b = a, c = b;
f(a) ; f(b); f(c);
 
answer:
a와 b와 c가 모두 같은 시리얼 넘버를 출력하는 결과가 나온다. 왜냐하면
copy constructor를 지정해주지 않으면 멤버 대 멤버로 그대로 복사(Shallow copy)가 일어나기 때문이다.
 
  1. numbered는 새로운 시리얼 넘버를 생성하는 copy constructor를 가진다. 그 호출은 결과를 바꿀까?
그렇다면 왜? 어떤 출력이 생성될까?
 
answer:
새로운 시리얼 넘버가 생성 될 것이다. 대입연산자를 사용했을 때 copy constructor가 실행되기 때문이다.
세 객체 모두 다른 시리얼 넘버를 가지게 될 것이다.
 
3. f의 파라미터가 const numbered& 라면 어떻게 될까? 결과가 바뀔까? 바뀐다면 어떻게 출력이 될까?
 
answer:
결과는 2번과 다르지 않을 것이다.이미 객체의 멤버에는 저장되어 있기 때문에 결과는 크게 다를 것 같지 않다.
 
4. 세 가지 질문에 부합하는 클래스 numbered와 함수 f를 작성해라. 너가 예상한 결과와 같은 지 확인해라.
 
answer:
소스코드 참조
#include <iostream>
#include<string>

using namespace std;

class numbered {
	
public:
	int id;
	numbered();
	numbered(const numbered&);

};
numbered::numbered() {
	id = 1;
	id++;
}
numbered::numbered(const numbered& a) {
	id = a.id +1;
}

void f(const numbered& s) { cout << s.id << endl; }

int main() {
	numbered a, b = a, c = b;
	f(a); f(b); f(c);
	
}
반응형