용어 설명
(요즘에는 Rule of 3/5/7 이라고 더 많이 부른다.)
orthodox : 정통의 Canonical : 표준, 기준
Cpp에서 필요한 4가지
- 기본 생성자
- 복사 생성자
- 할당 연산자 오버로딩
- 소멸자
생성자와 소멸자는 객체라는 것을 다뤄봤다면 익숙할 것이다.
그러나 복사 생성자와 할당 연산자 오버로딩은 좀 어려운 개념.
따라서 이를 한 번 정리해보자.
복사 생성자
다른 클래스를 복사해 새로운 클래스를 만드는 생성자.
cpp
class Fixed
{
...
Fixed(const Fixed &f) {
this->value = f.getvalue(); // 새로운 객체를 복사
}
};
왜 필요한가?
- 객체를 복사하거나, 초기화하기 위해
- 얕은 복사가(=포인터를 복사하는 것) 아닌, 깊은 복사를(=값을 복사하는 것) 해서 완전한 독립성을 보장하기 위해.
어떻게 만드는가?
- 파라미터로 기존 객체의 레퍼런스를 이용한다 :
Fixed(const ``Fixed &f``) - 가지고 있는 멤버 변수를 복사해준다. 이때 변수가
private라면,get_()계열 함수를 이용해 값을 복사해준다.
할당 연산자 오버로딩
또는 대입 연산자 오버로딩이라고도 한다.
overloading : 클래스 안에서 같은 이름을 가진 함수나 연산자를 2개 이상 작성하는 것.
할당 연산자 : 할당에 쓰이는 연산자. ‘=’을 의미.
cpp
class Fixed
{
...
Fixed &operator=(const Fixed &f)
{
if (this != &f)
this->value = f.getRawBits();
}
};
왜 =을 다시 만들어야 하는가?
- 역시 클래스 복사를 위해서 만드는 것.
- class A가 있고, class B가 있다고 치자.
- =이 기본 할당 연산자라면, 얕은 복사만 될 것이다.
- 반면 =을 다시 만들어서 깊은 복사를 지원한다면, 우리가 의도하는 대로 복사가 진행될 것이다.