열렬히.뛰기

Orthodox Canonical form

Language > 프로그래밍 언어 > C++ > Cpp : 기초 > Orthodox Canonical form

용어 설명

(요즘에는 Rule of 3/5/7 이라고 더 많이 부른다.)

orthodox : 정통의 Canonical : 표준, 기준

Cpp에서 필요한 4가지

  1. 기본 생성자
  2. 복사 생성자
  3. 할당 연산자 오버로딩
  4. 소멸자

생성자와 소멸자는 객체라는 것을 다뤄봤다면 익숙할 것이다.

그러나 복사 생성자와 할당 연산자 오버로딩은 좀 어려운 개념.

따라서 이를 한 번 정리해보자.

복사 생성자

다른 클래스를 복사해 새로운 클래스를 만드는 생성자.

cpp
class Fixed
{
	...
	Fixed(const Fixed &f) {
			this->value = f.getvalue(); // 새로운 객체를 복사
	}
};

왜 필요한가?

  1. 객체를 복사하거나, 초기화하기 위해
  2. 얕은 복사가(=포인터를 복사하는 것) 아닌, 깊은 복사를(=값을 복사하는 것) 해서 완전한 독립성을 보장하기 위해.

어떻게 만드는가?

  1. 파라미터로 기존 객체의 레퍼런스를 이용한다 : Fixed(const ``Fixed &f``)
  2. 가지고 있는 멤버 변수를 복사해준다. 이때 변수가 private 라면, get_() 계열 함수를 이용해 값을 복사해준다.

할당 연산자 오버로딩

또는 대입 연산자 오버로딩이라고도 한다.

overloading : 클래스 안에서 같은 이름을 가진 함수나 연산자를 2개 이상 작성하는 것.

할당 연산자 : 할당에 쓰이는 연산자. ‘=’을 의미.

cpp
class Fixed
{
	...
	Fixed &operator=(const Fixed &f)
	{
		if (this != &f)
			this->value = f.getRawBits();
	}
};

왜 =을 다시 만들어야 하는가?

  • 역시 클래스 복사를 위해서 만드는 것.
  • class A가 있고, class B가 있다고 치자.
    • =이 기본 할당 연산자라면, 얕은 복사만 될 것이다.
    • 반면 =을 다시 만들어서 깊은 복사를 지원한다면, 우리가 의도하는 대로 복사가 진행될 것이다.