Coding/Unreal, C++

[C++ Prime Plus] 12. Classes and Dynamic Memory Allocation

Dynamic Memory and Classes

  • C++은 Memory allocation을 runtime에 정하는 방식이다.
  • C++은 Dynamic Memory allocation을 위해 new와 delete 연산자를 사용한다.
  • 이로 인해, 우리는 새로운 문제를 풀어야만 한다.

Special Member Functions

  • C++은 다음 멤버 함수를 자동으로 만들어낸다.
    • 만약 생성자가 없으면, default constructor를 만들어낸다.
    • 따로 정의하지 않았다면, default destructor를 만들어낸다.
    • 따로 정의하지 않았다면, copy constructor를 만들어낸다.
    • 따로 정의하지 않았다면, = operator를 만들어낸다.
    • 따로 정의하지 않았다면, & operator를 만들어낸다.
  • 좀더 정확히 말하자면, default constructor나 default destructor는 없으면 무조건 만들어내지만, copy, =, &는 사용했다면 컴파일러가 만들어내는 방식이다.

Copy Constructors

  • copy constructor는 다른 오브젝트를 복사해서 객체를 생성할 때 사용된다. 문법은 다음과 같다.
ClassName(const ClassName &);
  • Default Copy constructor는 static이 아닌 모든 member를 복사하는 형태로 만들어진다.

When an Assignment Operator Is Used and What It Does

Dummy d1;
Dummy d2 = d1; // copy constructor invoked, possibly = operator too.
Dummy d3;
d3 = d1; // assignment operator invoked
  • (visual c++에서는 두번째 줄에서 복사 생성자만 호출되었다.)
  • 여기서 유의할 점은 =을 쓴다고 무조건 = operator가 호출되는 게 아니라는 것이다. 생성하는 상황이면 copy constructor가 호출된다.

Static Class Member Functions

  • member function에 static을 붙일 수 있다. 이렇게 되면 특정 오브젝트와 멤버 함수가 연관성이 사라지게 되는데, 그러면서 두가지 변화가 생긴다.
    1. some_object.static_method()형태가 아니라 class_name::static_method() 형태로 호출된다.
    2. static member variable만 가져올 수 있다. (특정 오브젝트와 연관성이 없으므로 생각해보면 당연하긴 함)

Things to Remember When Using new in Constructors

  • 생성자에서 new를 썼다면 소멸자에서는 꼭 delete를 써서 짝을 맞춰주자.
  • new - delete, new[] - delete[] 의 짝을 맞춰주자.
  • 생성자 오버로딩이 되어 있다면 모든 생성자는 new를 비슷한 방식으로 사용해줘야 한다. 그래야 하나있는 소멸자와 짝이 맞춰진다.

NULL or 0 or nullptr?

  • 변수를 기본값으로 초기화할 때 보통 0으로 설정한다. 이 때, 타입에 따라서 초기화를 할 때, remind를 위해 다음과 같이 하곤 했다.
char c = '\0'; // rather than char c = 0
  • 이 때, '\0'은 0과 같으므로 0이라고 써도 되지만 '\0'이라고 써서 c가 char 타입이라는 걸 상기시켜줬다. nullptr도 pointer형에 똑같은 역할을 한다.
int* a = 0; // C style
int* a = NULL; // C++98 style
int* a = nullptr; // C++11 style, and Best one
  • a가 pointer형임을 상기시킴과 동시에 디폴트값으로 초기화할 수 있는 것이다.

Observations About Returning Objects

  • 만약 어떤 함수가 매개변수로 레퍼런스를 받았고 이를 그대로 반환해도 되는 상황이라면 레퍼런스 타입으로 리턴하는 게 좋다.
const Vector& Max(const Vector& v1, const Vector& v2)
{
	return v1.magval() >= v2.magval ? v1 : v2;
}

References

  • C++ Primer Plus 6th, Chapter 12