컴퓨터 언어/C++

[C++] C++ 18일차 오버로딩 4 (복사 생성자)

훈츠 2020. 4. 22. 17:41
반응형

 

안녕하세요. 훈츠입니다. 금일은 클래스 객체 복사에 관련 포스팅 합니다.


복사 생성자

 

이전 시간에 클래스간 복사를 할때, 선언과 동시에 할당을 할 경우 생성자는 한번만 호출되고 소멸자만 두번 호출 되는것을 보셨을것입니다. 만약 이때 생성자에 메모리 할당이 있는 경우는 프로그램이 다운 됩니다.

선언과 동시에 클래스 복사하고자 할때 사용하는것이 복사 생성자 입니다.  

 

 

  • 메모리를 생성하는 생성자를 사용하는 경우 클래스 객체의 복사는 해제할 메모리 주소를 잃어버리게 하여 프로그램을 다운되게 합니다. 
  • 클래스를 복사함과 동시에 초기화 하는것은 생성자가 호출되지 않는 단점이 있다.

 

복사 생성자의 호출

  • 객체를 복사하면서 초기화하는 대입에서 복사생성자가 호출

 

복사 생성자의 형식

  • 생성자와 같은 형식이며 매개변수로 클래스의 참조형만 포함된다.
  • Class A { A(const A& RefA){ } // 복사 생성자
  • ~A () { } 소멸자는 같습니다.

 

복사 생성자 예제

  • 복사 생성자 호출 (복사 + 초기화)

복사 생성자 예제 코드

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
 
#include "pch.h"
#include <iostream>
using namespace std;
 
class A {
private:
    int m_nVal;
    public:
        A(int val):m_nVal(val) { cout << "A 생성자"<<"A 초기값:" <<m_nVal << endl; }
        ~A() { cout << "A 소멸자" << endl; }
};
class B {
 
    
public:
    char* m_nPtr;
    char* Get() const {
        return m_nPtr;
    }
    // 일반 생성자
    B(char* pStr)
    {
        m_nPtr = new char[strlen(pStr) + 1];
        strcpy_s(m_nPtr, sizeof(m_nPtr), pStr);
        cout << "객체주소 : " << m_nPtr << ":" << this << endl;
 
    }
 
    //복사 생성자 
    B(const B& RefB) 
    { 
        m_nPtr = new char[strlen(RefB.Get()) + 1];
        strcpy_s(m_nPtr, sizeof(m_nPtr), RefB.Get());
        cout << "객체주소 : " << m_nPtr << ":" << this << endl;
 
    }
    ~B() 
    { 
        delete [] m_nPtr;
        cout << "B 소멸자" << endl; 
    }
};
 
 
int  main()
{
    A a(10);
 
    char str[] = "C++";
    char* pStr = &str[0];
    cout << pStr << endl;
 
    B b(pStr);
    B c = b;  // 생성과 동시에 복사하는코드가 호출되었을때, 복사생성자가 호출됩니다. 
  
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형