Data+

3. 복사생성자를 통한 깊은 복사.

by Qerogram

1. Default Copy Creator로는 메모리주소가 중복되는 얕은복사가 잦게 일어난다.

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
#include <iostream>
 
using namespace std;
 
class Dog {
  private :
    int Dognum;
  public :
    ~Dog() {
      cout << "소멸자 호출" << endl;
    }
    Dog() {
      cout << "생성자 호출" << endl;
    }
    Dog(int num) : Dognum(num) {
      cout << "생성자 호출" << endl;
    }
 
    int getNum() const { return Dognum; }
    void setNum(int num) { Dognum = num; }
};
 
int main(int argc, char* argv[]) {
  Dog d(10);
  Dog d2(d);
  printf("d = %p\n", d);
  printf("d2 = %p\n", d2);
  cout << d.getNum() << endl;
  cout << d2.getNum() << endl;
  return 0;
}
cs


* 결과

실제로도, 생성자를 1회, 소멸자를 2회 호출하는 모습을 확인가능하다.

생성자 호출
d = 0x7ffd801adc20
d2 = 0x7ffd801adc10
10
10
소멸자 호출
소멸자 호출


* 결과


2. 복사생성자를 Overloading해주면 깊은 복사가 가능하다.

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
#include <iostream>
 
using namespace std;
 
class Dog {
  private :
    int Dognum;
  public :
    ~Dog() {
      cout << "소멸자 호출" << endl;
    }
    
    Dog(int num) : Dognum(num) {
      cout << "생성자 호출" << endl;
    }
    Dog(Dog& Dog2) {
      setNum(Dog2.getNum());
      cout << "복사 생성자 호출" << endl;
    }
    int getNum() const { return Dognum; }
    void setNum(int num) { Dognum = num; }
};
 
int main(int argc, char* argv[]) {
  Dog d(10);
  Dog d2(d);
  printf("d = %p\n", d);
  printf("d2 = %p\n", d2);
  cout << d.getNum() << endl;
  cout << d2.getNum() << endl;
  return 0;
}
cs


*결과

생성자 호출
복사 생성자 호출
d = 0x7fff3eecfbb0
d2 = 0x7fff3eecfba0
10
10
소멸자 호출
소멸자 호출


'코딩 > C&C++' 카테고리의 다른 글

6. Quick Sort  (0) 2017.04.10
5. void PTR  (0) 2017.04.09
4. 다형성  (0) 2017.04.09
2. 연산자 오버로딩(Overloading)  (0) 2017.04.08
1. Template  (0) 2017.04.07

블로그의 정보

Data+

Qerogram

활동하기