ex)
CListMaingame::CListMaingame() : m_pStudent(nullptr)
{
memset(m_pStudent Arr, 0, sizeof(m_pStudent_Arr))
}
생성자: 변수(값)
대입 연산보다 속도가 빠르며, 랜덤 값 및 배열 값 초기화도 가능
But! 배열의 각 원소, 구조체의 각 원소 등 여러 개의 원소를 가지는 데이터에 대한 초기화는?
memset등을 생성자 내부에서 실행 시키는 방식으로 진행 가능
복사 생성자 : 객체를 생성할 때 같은 객체를 복사하여 생성하는 생성자
의문점?
1의 경우 멤버 변수의 수가 비약적으로 증가함에 비해
2의 경우 한 객체 당 한 블럭으로 인식하여 연산 속도 측면에서 이득을 봄
선언
ex)
CListMaingame(const CListMaingame& rhs);
rhs에 복사할 객체가 들어가게 된다
특징!
복사 생성자 또한 엄연히 생성자에 속한다
따라서 복사 생성자를 명시적으로 생성할 경우 default 생성자는 생성되지 않는다.
명시적으로 복사 연산자를 생성할 경우 생성자 또한 명시적으로 생성해야 한다
복사 생성자의 동작 시점
ex)
CObj obj; -> 객체 선언
CObj temp(obj); -> 선언된 obj 객체에 대한 복사객체 temp 생성
매개변수의 동작 방식은 해당 값을 복사하는 방식
객체에 대한 복사가 일어나게 되면 복사 생성자가 동작하게 된다
따라서 함수의 내부로 들어가게 되는 객체는 매개변수로 넣어준 객체에 대한 복사본이다
복사 생성자가 동작하는 행위 또한 객체가 생성되는 것이며, 이 객체 또한 소멸자를 호출한다
-> 만약 소멸자가 내부 Release()함수가 있고, 멤버 변수 중 동적 할당된 멤버가 있다면? -> 동적 할당된 멤버가 Release() 로 인해 해제되고, 사용이 불가능 해짐
매개변수와 동일하게 return의 경우에도 복사값을 반환하게 된다 -> 복사 생성자 동작
return문을 탈출하게 되면 해당 생성된 객체는 소멸되므로 소멸자도 호출 -> 2번 케이스와 같은 문제가 발생하게 된다
얕은 복사, 깊은 복사
얕은 복사 :Initialize(이니셜 라이즈), 대입 등으로 값을 받아오는 복사
깊은 복사 : 복사할 값에 대해 같은 타입으로 생성한 뒤, 해당 값을 복사하는 복사
동적 할당된 변수에 대해 복사하는 경우
결론!! 얕은 복사는 하나의 값에 대해 하나의 주소가 존재하는데, 이 주소를 여러개의 포인터가 소유
깊은 복사는 하나의 값을 가진 여러개의 주소가 존재
this 포인터 : 객체 자신의 주소를 가지는 포인터 자신의 주소를 나타내므로 이를 사용하여 값을 참조할 수 있다
*this = 자기 자신
But! this 포인터를 이용하여 private 변수를 가공하는 행위는 불가능하다
extern : 전역변수를 다른 파일에서도 사용할 수 있도록 해주는 키워드
extern int iNum;
전방 선언과 비슷한 맥락으로, 해당 전역변수의 존재를 알려줄 뿐 메모리 할당을 받지 않는다
Static을 사용한 기능성 클래스를 사용하는 것이 보다 좋은 방식이다