개발자 면접 질문 정리 - C++
- ⭐ Development/Coding Interview
- 2021. 10. 19.
C++
가상함수 virtual Fuction
- 가상함수는 파생 클래스에서 재정의 할 것으로 기대하는 멤버 함수를 뜻한다.
- 파생클래스에서 virtual 키워드를 사용하지 않아도 자동으로 가상함수가 된다.
가상 소멸자
- 소멸자는 가상함수로 선언 하여 기본 클래스와 파생 클래스 모든 소멸자가 호출되도록 한다.
생성자와 소멸자 호출 순서
- 부모 클래스가 있는 자식 클래스는
부모생성자 - 자식생성자 - 자식소멸자 - 부모소멸자
순으로 호출된다.
new, delete 연산자 오버로딩
- new 연산자는 메모리 할당, 생성자 호출, 주소 값의 형변환 작업을 진행한다.
- 연산자 함수가 먼저 호출되고 해당 타입의 생성자가 호출된다.
void * operator new (size_t size) { void * adr = new char[size]; return adr; }
- delete 연산자로 객체 소멸을 호출하면 해당 타입의 소멸자가 호출되고 delete 연산자 함수에 주소값을 전달한다.
void operator delete (void * adr)
{
delete []adr;
}
복사 생성자
복사생성자는 Class c(other);
의 형태로 호출이 된다. 모든 클래스는 기본적으로 복사 생성자가 제공(얕은 복사)되나 객체의 변수값을 그대로 복사해주어 생성자에 동적할당이 포함된 클래스라면 값 변경이나 해제 등에서 문제가 발생할 수 있다.
다음과 같은 형태로 복사 생성자를 정의하여 복사 생성자에서도 동적할당이 일어 날수 있도록 하자(깊은 복사)
class Test
{
public:
Test(const Text& t) { ...중략... }
}
malloc / new
- malloc은 사이즈를 매개변수로 받고, 리턴 타입이 void* 형이다. new는 할당할 타입을 지정하면 해당 타입의 포인터로 넘어 온다.
- malloc은 메모리를 동적으로 할당하고 초기값을 지정해 줄수 없지만, new는 할당과 동시에 생성자를 호출한다.
Cast 연산자
명시적 형변환
- C 스타일의 명시적 형변환은 변환하고자 하는 항목 앞에
(변환타입)
을 붙여서 사용한다.
int num = 1;
float fNum = (float)num;
static_cast
- static_cast는 컴파일 타임에 형변환에 대한 타입오류를 검사한다.
int num = 1;
float fNum = static_cast<float>(num);
const_cast
- const_cast는 포인터(pointer)나 참조형(reference)의 상수성(const)를 제거하는데 사용한다.
char str = "string";
const char* ptr = str;
char* c = const_cast<char*>(ptr);
c[0] = "a";
reinterpret_cast
- reinterpret_cast는 임의의 포인터 끼리의 변환을 허용한다. 대상을 변환할 타입으로 비트단위로 바꾸어 준다.
- 다른 형태의 포인터로 변경이 가능하기에 형변환의 결과는 컴파일러마다 다르고, 결과적으로 예상하지 못한 잘못된 데이터로 변경될 우려가 있다.
dynamic_cast
- dynamic_cast는 다운캐스팅에 사용이 된다. (업캐스팅은 static_cast를 사용)
- 런타임 시간에 검사하기때문에 비용이 높다.
- 성공하면 원하는 타입의 값을 반환하고 실패하면 null 포인터를 반환한다.
Parent* pParent = new Child();
Child* pChild = static_cast<Child*>(pParent);
반응형