이번 포스트에서는 C++에서 대입 연산자와 복사 생성자의 동작 방식에 대해 예제 코드를 통해 자세히 알아보겠습니다. 이를 통해 객체의 복사와 관련된 메모리 문제를 어떻게 해결할 수 있는지 학습할 것입니다.
#pragma once
#pragma warning(disable: 4996)
#include <iostream>
class GoodPerson
{
private:
float _weight;
float _height;
char* _name;
public:
GoodPerson() {}
GoodPerson(float weight, float height, const char* name)
: _weight(weight), _height(height), _name(new char[strlen(name) + 1])
{
strcpy(_name, name);
}
GoodPerson(const GoodPerson& person)
: GoodPerson(person._weight, person._height, person._name)
{
}
~GoodPerson()
{
delete[] _name; // 복사된 객체들이 중복 삭제 될 위험이 있음
}
GoodPerson& operator=(const GoodPerson& person)
{
_weight = person._weight;
_height = person._height;
delete[] _name;
_name = new char[strlen(person._name) + 1];
strcpy(_name, person._name);
return *this;
}
void print() const
{
using namespace std;
cout << _name << endl;
cout << _weight << endl;
cout << _height << endl;
}
};
#pragma once: 이 지시어는 헤더 파일이 여러 번 포함되는 것을 방지합니다. 중복 포함으로 인한 컴파일 오류를 방지하는 역할을 합니다.
#pragma warning(disable: 4996): 컴파일러 경고 4996을 비활성화합니다. 이는 strcpy
와 같은 "안전하지 않은" C 함수에 대한 경고를 억제하는 데 사용됩니다.
클래스 GoodPerson
의 멤버 변수:
_weight
와 _height
는 각각 float
타입의 몸무게와 키를 저장합니다._name
은 char*
타입으로 이름을 저장하는데, 동적 메모리 할당을 사용하여 저장합니다.생성자:
strcpy
로 복사합니다.GoodPerson
객체를 복사하여 새 객체를 생성합니다. 이때 중복된 코드 작성을 피하기 위해, 위임 생성자를 사용하여 초기화합니다.소멸자:
대입 연산자:
print 함수:
int main()
{
int a = 1;
int b = a; // 복사 생성자
a = b; // 대입 연산자
func(a); // 복사
GoodPerson goodPerson0 = { 46.f, 153.f, "David Daehee Kim" };
GoodPerson goodPerson1 = goodPerson0;
GoodPerson goodPerson2;
goodPerson2 = goodPerson0;
goodPerson0.print();
goodPerson1.print();
goodPerson2.print();
}
기본 자료형의 복사:
int a = 1;
에서 b
는 a
의 값을 복사받습니다. 이는 복사 생성자의 개념과 유사합니다.a = b;
에서는 a
에 b
의 값을 대입하며, 이는 대입 연산자의 개념과 유사합니다.객체의 복사:
GoodPerson goodPerson0
은 이름, 몸무게, 키로 초기화된 객체를 생성합니다.GoodPerson goodPerson1 = goodPerson0;
은 복사 생성자를 사용하여 goodPerson0
을 복사한 새로운 객체를 생성합니다.GoodPerson goodPerson2;
로 기본 생성자를 호출한 후, goodPerson2 = goodPerson0;
로 대입 연산자를 통해 goodPerson0
의 데이터를 goodPerson2
에 복사합니다.출력:
위 코드에서 복사 생성자와 대입 연산자는 동적 메모리 할당을 잘 처리하고 있지만, 소멸자에서의 중복 메모리 해제 문제가 발생할 수 있습니다. 이 문제는 깊은 복사를 통해 해결할 수 있습니다.
복사 생성자와 대입 연산자를 정의할 때, 동적 메모리를 안전하게 관리하는 것이 중요합니다. 특히, 복사할 때마다 새로운 메모리를 할당하고, 기존 메모리를 안전하게 해제하는지 확인해야 합니다.
이 포스트에서는 C++의 복사 생성자와 대입 연산자에 대해 살펴보았습니다. 객체의 복사 시 메모리 관리의 중요성을 이해하고, 올바르게 복사 생성자와 대입 연산자를 구현하는 방법을 익히는 것이 중요합니다. 이번 예제를 통해 메모리 관리와 객체 복사에 대해 명확히 이해할 수 있기를 바랍니다.
이제 이 개념들을 복습하고 실습하여 완전히 익혀보세요!