C++ : 연산자 오버로딩(5) - 대입 연산자 오버로딩의 중요성

참고 : 열혈강의 C++ 프로그래밍 책

기본적으로

복사 생성자 특성

1. 정의하지 않으며 디폴트 복사 생성자가 삽입된다.
2. 디폴트 복사 생성자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다
3. 생성자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다.

// 복사 생성자
void main()
{
 Class c1(1, 2);
 Class c2 = c1;
}
대입 연산자 특성

1. 정의하지 않으면 디폴트 대입 연산자가 삽입된다.
2. 디폴트 대입 연산자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다.
3. 연산자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다.

// 대입 연산자
void main)
{
 Class c1(1, 2);
 Class c2(3, 4);

 c2 = c1;
};
대입 연산자를 이용하면서 동적할당을 한다면 주의할 점이 있다.


#include <iostream>
using namespace std;

class Person
{
private:
 char* name;
 int age;

public:
 Person(char* myname, int myage)
 {
  int len = strlen(myname) + 1;
  name = new char[len];
  strcpy(name, myname);
  age = myage;
 }

 void ShowPersonInfo() const
 {
  cout << "이름 : " << name << endl;
  cout << "나이 : " << age << endl;
 }

 Person& operator=(const Person& ref)
 {
  // 생성자에 동적 할당한 것을 해제해야 메모리 누수를 방지한다.
  delete []name;
  int len = strlen(ref.name) + 1;
  name = new char[len];
  strcpy(name, ref.name);
  age = ref.age;

  return *this;
 }

 ~Person()
 {
  delete []name;
  cout << "called destructor!" << endl;
 }
};

// 테스트
void Operator5()
{
 // man1과 man2의 생성자에서 각각 문자열 동적 할당을 한다.
 Person man1("Lee dong woo", 29);
 Person man2("Yoon ji yul", 22);

 // 대입 연산자를 이용하면 man2의 생성자에서 동적 할당한 메모리를 해제해야한다.(메모리 누수 발생)
 man2 = man1;

 man1.ShowPersonInfo();
 man2.ShowPersonInfo();
}

댓글

이 블로그의 인기 게시물

C++ : Class로 만든 DLL Export 및 Import

VMware 환경에서 우분투로 안드로이드 환경 구축하기(1)