일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- html video
- #2차원배열
- #성적관리프로그램
- docker example
- #다차원포인터
- html charset
- relative path
- #binary
- #3차원배열
- #C++ has~a
- html multimedia
- html5 new tag
- 하이퍼레저패브릭
- html id
- #1차원배열
- html object
- git flow
- hyperledger transaction
- #자바상속#자바이즈어#is~a
- #CallByAddress
- #bubbleSort
- html youtube
- #JAVASCRIPT
- html code
- #android activity
- 토큰경제
- html plug-in
- border-box
- mac terminal command
- #C++ 연산자함수오버로딩
Archives
- Today
- Total
A sentimental robot
복사생성자 본문
복사생성자 호출시기
1. 객체 생성 시 객체를 인자로 줄 경우
2. 객체 생성 시 객체를 대입 할 경우
3. 메소드의 매개변수로 객체를 선언할 경우
4. 메소드에서 객체를 리턴할 경우
복사생성자는 객체가 생성되는 시점에서 데이터들이 몽땅 복사가 된다.
cf. 대입연산자함수는 객체가 생성된 이후에 ; 복사생성자와 시점이 다르다.
얉은 복사 : 필드를 포인터로 쓰지 않음
깊은 복사 : 개발자 몫
둘 다 목적은 field copy
- 얉은 복사
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 |
#include<iostream>
using namespace std;
class A {
int a;
public:A(int a = 0) { this->a = a; }
A(A &t)
{
this->a = t.a;
} // 디폴트 복사생성자의 모습..
int getA()const {
return a;
}
};
void main() {
A aa(90);
cout << aa.getA() << endl; // 90
A bb(aa); // 복사생성자함수 호출하면 생성자 안 감
cout << bb.getA() << endl; // 90
}
|
cs |
- 깊은 복사
디폴트 복사생성자를 사용했을 때
필드를 포인터로 썼을 경우에 문제가 생긴다 -> 주소를 복사해버리기 때문에
main이 끝나고 bb가 소멸할 때 a,b가 가르키는 주소를 delete 하고
aa 가 소멸할 때 이미 삭제 된 a,b를 delete 할 때 터짐
그래서 복사생성자 오버로딩해서 값만 복사해옴
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 |
#include<iostream>
using namespace std;
class A {
int *a;
int *b;
public:A(int a = 0)
{
this->a = new int;
this->b = new int;
*(this->a) = a;
*(this->b) = a;
}
~A() {
delete a;
delete b;
}
A(const A &t) // bb에서 aa클래스의 값을 변경하지 못하게 const
{
// *(t.a)=1000; // const를 하면 못하게 막을 수 있음
this->a = new int;
this->b = new int;
*(this->a) = *(t.a);
*(this->b) = *(t.b);
}
int getA()const {
return *a;
}
int getB()const {
return *b;
}
};
void main() {
A aa(90);
cout << aa.getA() << aa.getB() << endl;
A bb(aa);
cout << bb.getA() << aa.getB() << endl;
}
|
cs |