티스토리 뷰
* c++ 에선 특이하게 생성자 종류가 2가지가 있다. 앞 포스팅에서는 일반생성자에 대해서 다뤘다. 이번에는 복사생성자에 대해서 다뤄보겠다.
* class 구조
1. 생성자함수
2. 복사생성자함수
3. 소멸자 함수
4. 대입연산자 함수
* 복사 생성자
매개 변수가 있는 생성자 중에서 다른 개체를 인자로 전달받아 복사된 개체를 생성하는 생성자이다. 개발자가 복사 생성자를 정의하지 않으면 컴파일러는 디폴트 복사 생성자를 만들어준다. 디폴트 복사 생성자에서는 입력 인자로 전달된 개체의 메모리를 덤핑하여 생성하는 개체의 메모리에 복사하는 작업을 수행한다. 즉, 새로 생성되는 개체는 입력 개체와 같은 값들을 갖는 개체가 생성 되는 것이다.
* 복사 생성자 특징
1. 객체 선언 해주면서 객체의 모든 멤버(필드)의 값을 복사해주는 기능을 제공한다.
2. 생김새
A (const A & aa){
기능: 모든 필드값 카피
} → 생성자에서 객체를 레퍼런스(참조) 하도록 되어 있음
3. 복사 생성자도 2가지가 있다.
(1) 얕은 복사(디폴트, 기본적으로 얕은 복사를 제공해서 자동으로 복사해준다.)
(2) 깊은 복사(깊은 복사는 기본적으로 제공하지 않기 때문에 개발자가 필요에 의해 코딩하여 제공해야한다.)
4. 깊은 복사는 필드를 포인터로 사용했을때 쓴다. 포인터 쓰지 않으면 런타임오류 발생
5. 외부에서 접근하기 때문에 복사생성자함수는 public 접근지정자 사용한다.
* 복사생성자 함수
1. 호출시기
(1) 객체 생성시 객체를 인자로 줄경우
void main(){
A aa → 생성자 호출
A bb(aa); → 복사생성자 호출
}
(2) 객체 생성시 객체를 대입할 경우
void main(){
A aa →생성자 호출
A bb = aa; →복사생성자 호출
}
(3)member function의 매개변수로 객체를 선언할 경우
void A::disp(A aa); → 복사생성자 호출(이 방법은 후에 자세히 다루도록함)
(4) 멤버함수에서 객체를 리턴할 경우
A getObject(){
return 객체; →복사생성자 호출
}
* 복사 생성자 이해하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 |
#include <iostream>
#include <iomanip>
using namespace std;
class A {
int a;
int b;
//c++에서 this는 포인터로 나타냄
//this는 자기자신의 객체를 구별해주는 역할, 항상 자기자신만 접근가능
//this는 인스턴스 메소드 맨 첫줄에 존재, 객체를 만들어야지만 사용가능
//this는 static 공간 에서는 존재하지 않음, static은 객체를 선언할 수 없기 때문에
//자기자신의 객체를 구별할 필요도 없음
/*
- this를 명시적으로 써야할때
1. 매개변수와 지역변수의 필드명이 똑같을때
2. 메소드에서 자기자신을 리턴할때 (반복적으로 일을 수행할때 씀)
*/
public :
//생성자도 인스턴스 메소드이다
A(int a=0, int b=0) {//생성자에는 a와 b라는 2개의 공간이 있다.
this->a = a; //this가 가리키는 지역변수a 는 매개변수 a의 값을 넣는다.
this->b = b; //this가 가리키는 지역변수b 는 매개변수 b의 값을 넣는다.
}
//복사생성자
A(const A&aa) {//레퍼런스 변수
cout << "복사생성자" << endl;
a = aa.a; //cc의 a 공간에 bb의 a 값을 넣는다.
b = aa.b; //cc의 b 공간에 bb의 b 값을 넣는다.
}
//값 밖으로 보내는 함수
void setA(int a) {
this->a = a;//내 a라는 공간에 매개변수 a의 값을 집어넣음
}
void setB(int b) {
this->b = b;//내 b라는 공간에 매개변수 b의 값을 집어넣음
}
//값 넣는 함수
int getA() { return a; }//a를 리턴하면 setA()로 간다
int getB() { return b; }//b를 리턴하면 setB()로 간다
};
void main() {
A bb(10, 20);
A aa;
cout << aa.getA() << "\t" << aa.getB() << endl;//0,0
cout << bb.getA() << "\t" << bb.getB() << endl;//10,20
A cc(bb);//복사생성자 호출
//값을 주지 않고, 객체를 보냈을때
//디폴트 복사생성자를 호출하여 bb의 필드 전체값을 복사해서 출력함
cout << cc.getA() << "\t" << cc.getB() << endl;//10,20 출력
}
|
cs |
'Programming > C++' 카테고리의 다른 글
[c++]const (0) | 2018.03.08 |
---|---|
[c++]소멸자함수 (2) | 2018.03.07 |
[c++]class, 생성자 (0) | 2018.03.07 |
[C++]동적할당을 이용한 사람수 제한 없는 성적프로그램 (0) | 2018.03.06 |
[c++]다차원포인터를 이용한 성적프로그램 (0) | 2018.03.06 |