일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Python
- C++
- 이진 탐색 트리
- 후위
- 문자열
- mutable
- Basic
- 알고리즘
- template
- 트리
- 전위
- Windows
- 자료구조
- 비트코인
- 오버로딩
- Data Structure
- 기초
- 템플릿 함수화
- linked list
- 연결 리스트
- 숫자
- #선물 #비트코인#알트코인#매매#코인#마진
- SCM
- array
- 바이낸스
- trading view
- 순회
- BST
- 선물
- Tree
Archives
- Today
- Total
Project Hub
3. copy consturctor 본문
728x90
반응형
이전 글
2022.12.21 - [C++/c++ basic] - 2. reference
2. reference
이전 글 2022.12.21 - [C++/c++ basic] - 1. namespace 1. namespace namespace(이름공간) 개체를 구분할 수 있는 범위를 나타내는 말 함수나 구조체 혹은 변수 이름 등의 소속을 정해주는 것 아래는 namespace 사용 예
projecthub.tistory.com
복사 생성자 (copy constructor)
다른 객체에 대한 참조자를 인수로 전달받아, 그 참조자를 가지고 자신을 초기화하는 방법
새롭게 생성되는 객체가 원본 객체와 같으면서도, 완전한 독립성을 가지게 해준다.
// 클래스 T의 객체 a를 상수 레퍼런스로 받는다.
// a가 const 이기 때문에 복사 생성자 내부에서 a의 테이터를 변경할 수 없다.
// 새롭게 초기화 되는 인스턴스 변수들에게 '복사' 만 할 수 있다.
// 인자로 받는 변수의 내용을 함수에서 바꾸지 않을 것이기 때문.
T(const T& a);
디폴트 복사 생성자의 한계
C++ 컴파일러는 디폴트 생성자, 소멸자와 더불어 디폴트 복사 생성자를 지원한다.
그러나 아래와 같이 코드를 작성하게 되면 런타임 오류가 발생하게 된다.
#pragma once
#include <iostream>
class CBasic
{
public:
CBasic(int x, int y, const char* pname);
~CBasic();
public:
int iNum;
int iCnt;
char* name;
};
// 생성자
CBasic::CBasic(int x, int y, const char* pname)
{
iNum = x;
iCnt = y;
name = new char[strlen(pname) + 1];
strcpy(name, pname);
}
// 소멸자
CBasic::~CBasic()
{
if (name)
delete[] name;
}
int main()
{
CBasic basic(0, 0, "test");
// 디폴트 복사 생성자
CBasic basic1 = basic;
return 0;
}
이유는 디폴트 복사 생성자로 인해 포인터 변수인 name도 같은 값을 가지게 된다.
즉, 같은 주소 값을 가리키게 된다.
해당 상태는 문제가 없지만, 문제는 소멸자가 호출될 때 발생하게 된다.
basic 객체의 소멸자가 호출되면서 name 에 할당된 내용을 delete 한다.
그런데 basic1의 소멸자가 호출될 때, 이미 delete 된 name의 값을 또 다시 delete 하려고 한다.
이미 해제된 메모리에 접근해서 다시 해제하려고 하는 것이다.
따라서 런타임 오류가 발생하게 된다.
해당 문제를 해결하기 위해서는 동적 할당을 해서 내용을 복사하도록 하는 것이다.
직접 복사 생성자를 만들어야 한다.
#pragma once
#include <iostream>
class CBasic
{
public:
CBasic(int x, int y, const char* pname);
CBasic(const CBasic& basic); // 복사 생성자 선언
~CBasic();
public:
int iNum;
int iCnt;
char* name;
};
CBasic::CBasic(int x, int y, const char* pname)
{
iNum = x;
iCnt = y;
name = new char[strlen(pname) + 1];
strcpy(name, pname);
}
// 복사 생성자 정의
CBasic::CBasic(const CBasic& basic)
{
iNum = basic.iNum + 1;
iCnt = basic.iCnt + 1;
name = new char[strlen(basic.name) + 1];
strcpy(name, basic.name);
}
CBasic::~CBasic()
{
if (name)
delete[] name;
}
728x90
반응형
'C++ > c++ basic' 카테고리의 다른 글
6. Wrapper 클래스 - 타입변환 연산자 (1) | 2022.12.21 |
---|---|
5. 연산자 오버로딩, friend 키워드 (1) | 2022.12.21 |
4. implicit, explicit, mutable 키워드 (0) | 2022.12.21 |
2. reference (0) | 2022.12.21 |
1. namespace (0) | 2022.12.21 |
Comments