반응형
안녕하세요. 훈츠입니다. 금일은 클래스 객체 복사에 관련 포스팅 합니다.
복사 생성자
이전 시간에 클래스간 복사를 할때, 선언과 동시에 할당을 할 경우 생성자는 한번만 호출되고 소멸자만 두번 호출 되는것을 보셨을것입니다. 만약 이때 생성자에 메모리 할당이 있는 경우는 프로그램이 다운 됩니다.
선언과 동시에 클래스 복사하고자 할때 사용하는것이 복사 생성자 입니다.
- 메모리를 생성하는 생성자를 사용하는 경우 클래스 객체의 복사는 해제할 메모리 주소를 잃어버리게 하여 프로그램을 다운되게 합니다.
- 클래스를 복사함과 동시에 초기화 하는것은 생성자가 호출되지 않는 단점이 있다.
복사 생성자의 호출
- 객체를 복사하면서 초기화하는 대입에서 복사생성자가 호출
복사 생성자의 형식
- 생성자와 같은 형식이며 매개변수로 클래스의 참조형만 포함된다.
- 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
|
//Hoons Blog---https://rain2002kr.tistory.com------------------------------------------------------------------코드///
#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)
{
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 |
'컴퓨터 언어 > C++' 카테고리의 다른 글
[C++] C++ 20일차 static(정적) 멤버변수와 static(정적) 함수 (0) | 2020.04.24 |
---|---|
[C++] C++ 19일차 static(정적) 클래스와 지역 정적(static)클래스 1강 (0) | 2020.04.23 |
[C++] C++ 17일차 오버로딩 3 (클래스 객체 복사시 주의사항) (0) | 2020.04.21 |
[C++] C++ 16일차 함수 오버로딩 2 (0) | 2020.04.20 |
[C++] C++ 15일차 연산자 오버로딩 (0) | 2020.04.17 |