본문 바로가기

C++

static_cast

static_cast : 컴파일 타임에 형변환 가능한지 확인 후 가능하면 형변환, 불가능시 컴파일 에러.

static_cast에서 컴파일 타임에 오류가 발생하는 주요 규칙 위반

   상속 관계가 없는 클래스 간의 포인터 변환

 

class A {};
class B {};

A* a = new A();
B* b = static_cast<B*>(a);  // 오류: A와 B는 상속 관계가 아님

 

  1. static_cast는 상속 관계에 있는 클래스들 간의 포인터 변환만 허용합니다. 상속 관계가 없는 두 클래스 간에 포인터 변환을 시도하면 컴파일 오류가 발생합니다.상속 관계가 없는 클래스 간의 포인터 변환:

기본 타입 간의 유효하지 않은 변환:

int i = 10;
double* dp = static_cast<double*>(&i);  // 오류: int*에서 double*로 변환 불가
  • static_cast는 기본 타입 간의 변환을 허용하지만, 변환이 명확하지 않거나 지원되지 않는 경우에는 컴파일 오류가 발생합니다. 예를 들어, 포인터 타입과 정수형 사이의 변환은 허용되지 않습니다.

다중 상속에서의 모호성 문제:

class Base1 {};
class Base2 {};
class Derived : public Base1, public Base2 {};

Base1* b1 = new Derived();
Derived* d = static_cast<Derived*>(b1);  // 오류: 모호한 변환
  • 다중 상속의 경우, static_cast를 사용할 때 모호성이 발생할 수 있습니다. 예를 들어, 두 기본 클래스로부터 상속받은 파생 클래스가 있을 때, 기본 클래스의 포인터를 파생 클래스의 포인터로 캐스팅하려고 할 때 모호성이 있다면 컴파일 오류가 발생합니다.

삭제된 형변환 연산자:

class NonConvertible {
public:
    operator int() = delete;  // int로의 변환을 삭제
};

NonConvertible nc;
int i = static_cast<int>(nc);  // 오류: 삭제된 변환
  • C++11부터는 클래스에 대해 특정 형변환을 금지시키기 위해 삭제된 변환 함수를 사용할 수 있습니다. 삭제된 형변환 연산자를 사용하는 경우 static_cast로 변환을 시도하면 컴파일 오류가 발생합니다.삭제된 형변환 연산자:

순수 가상 클래스의 인스턴스화 시도:

class Abstract {
public:
    virtual void foo() = 0;  // 순수 가상 함수
};

class Concrete : public Abstract {
    // void foo() override {}  // 주석 해제하면 오류가 없음
};

Abstract* abs = new Concrete();
Concrete* con = static_cast<Concrete*>(abs);  // 오류: Concrete는 Abstract의 모든 함수를 구현하지 않음
  • 추상 클래스(순수 가상 함수가 있는 클래스)의 포인터나 참조를 구체 클래스의 포인터나 참조로 변환하려고 할 때, 구체 클래스가 추상 클래스의 모든 순수 가상 함수를 구현하지 않으면 오류가 발생할 수 있습니다.
 

 

'C++' 카테고리의 다른 글

dynamic_cast  (0) 2024.09.05
참조 타입 (Reference)  (0) 2024.07.07
문자 타입  (0) 2024.07.07
부동소수점  (0) 2024.07.03