C++ : 연산자 오버로딩(5) - 대입 연산자 오버로딩의 중요성
참고 : 열혈강의 C++ 프로그래밍 책
기본적으로
복사 생성자 특성
1. 정의하지 않으며 디폴트 복사 생성자가 삽입된다.
2. 디폴트 복사 생성자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다
3. 생성자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다.
1. 정의하지 않으면 디폴트 대입 연산자가 삽입된다.
2. 디폴트 대입 연산자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다.
3. 연산자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다.
기본적으로
복사 생성자 특성
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(); }
댓글
댓글 쓰기