static_cast 와 dynamic_cast

Programming/C++ Language 2015. 1. 7. 11:16

static_cast

: 컴파일러에게, 모든 형 변환에 대해 허용하도록 해주는 구문. 이 형변환에 대한 모든 책임은 프로그래머가 진다.

Car* pCar = new Truck();

Truck* pTruck = static_cast<Truck*>pCar;

pTruck->drive();

정상동작.

Car* pCar = new Car();

Truck* pTruck = static_cast<Truck*>pCar;

pTruck->drive();

비정상동작.

: 따라서, 정말 필요한 경우에만 제한적으로 사용하는 것이 좋다.

: 부모 포인터를 자식 포인터로 변환할때, 의도적으로 한다는 것을 표현할때 좋다.


dynamic_cast

: 상속관계에서의 안전한 형 변환

: 자식 객체의 포인터 및 참조형 변수를 부모형 포인터 및 참조형 변수로 형 변환 해주는데 사용 된다.

Car* pCar = new Truck();

Truck* pTruck = dynamic_cast<Truck*>pCar;

컴파일 에러

Car* pCar = new Car();

Truck* pTruck = dynamic_cast<Truck*>pCar;

컴파일 에러

Car* pTruck = new Truck();

Car* pCar = dynamic_cast<Truck*>pTruck;

컴파일 성공

'Programming > C++ Language' 카테고리의 다른 글

warning 에 대하여  (0) 2015.01.07
typeid 키워드  (0) 2014.04.15
Unique Pointer  (0) 2014.03.03
[C++] 동적바인딩( Dynamic binding )  (0) 2011.01.03
[C++] this 포인터 사용하기  (0) 2010.07.31

설정

트랙백

댓글

warning 에 대하여

Programming/C++ Language 2015. 1. 7. 11:05

1. field 'A' will be initialized after field 'B' [ -Wreorder ]


A가 B 다음에 초기화 될 거라는 경고 이다.Class 의 변수는 생성자에 나열된 순서대로 초기화 되는 것이 아니라, Class 에 선언된 순서대로 초기화가 된다. 따라서 A 와 B 가 다른 변수에 의존적으로 초기화가 될 경우, 의도치 않은 값으로 초기화가 되는 것을 방지하기 위한 경고이다.

Class TestClass{ int A; int B; }

TestClass() : B(n++), A(n++)

위와 같은 코드에서 n이 10일 경우, B에 10, A에 11이 들어가도록 의도적으로 개발을 했다고 할 경우

실제 결과는 A가 10이고 B가 11이 된다.


2. Suppressing warning


switch case 를 사용할 때, 의도적으로 break 를 빼는 경우가 있는데 

이때 컴파일러에서 no break at the end of case 라는 경고를 보여준다. 

이를 없애기 위해서는 eclipse 에서는 해당 경고에 마우스 오른쪽을 누르면 "Customize Problem..." 이라는 메뉴가 있다. 

여기에 보면 Comment text to suppress the problem 이라는 란이 있는데, 

여기에 있는 텍스트가 해당 경고가 표시되는 부분에 주석으로 포함되어 있으면 해당 경고가 사라지게 된다. 

switch(value){ 

case 1: 

... 

// no break

case 2:

break;

}


'Programming > C++ Language' 카테고리의 다른 글

static_cast 와 dynamic_cast  (0) 2015.01.07
typeid 키워드  (0) 2014.04.15
Unique Pointer  (0) 2014.03.03
[C++] 동적바인딩( Dynamic binding )  (0) 2011.01.03
[C++] this 포인터 사용하기  (0) 2010.07.31

설정

트랙백

댓글

typeid 키워드

Programming/C++ Language 2014. 4. 15. 13:36

typeid 키워드는 런타임에 오브젝트의 클래스를 결정하기 위해 사용 된다. std::type_info 오브젝트를 리턴한다.( 프로그램 종료까지 유지 되는 값 ) 단순히 class 정보만이 필요할 경우에, dynamic_cast<class_type> 보다는 typeid 를 사용하는 것을 선호한다.( typeid 의 수행속도가 짧음 )


#include <iostream>    // cout
#include <typeinfo>  //for 'typeid'
 
class Person {
public:
   // ... Person members ...
   virtual ~Person() {}
};
 
class Employee : public Person {
   // ... Employee members ...
};
 
int main() 
{
   Person person;
   Employee employee;
   Person* ptr = &employee;
   Person& ref = employee;
   // The string returned by typeid::name is implementation-defined
   std::cout << typeid(person).name() << std::endl;   // Person (statically known at compile-time)
   std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time)
   std::cout << typeid(ptr).name() << std::endl;      // Person* (statically known at compile-time)
   std::cout << typeid(*ptr).name() << std::endl;     // Employee (looked up dynamically at run-time
                                                      //           because it is the dereference of a
                                                      //           pointer to a polymorphic class)
   std::cout << typeid(ref).name() << std::endl;      // Employee (references can also be polymorphic)
 
   Person* p = nullptr;
   try {
      typeid(*p); // not undefined behavior; throws std::bad_typeid
                  // *p, *(p), *((p)), etc. all behave identically
   }
   catch (...)
   {}
 
   Person& pRef = *p; // Undefined behavior: dereferencing null
   typeid(pRef);      // does not meet requirements to throw std::bad_typeid
                      // because the expression for typeid is not the result
                      // of applying the unary * operator
}

Output (exact output varies by system):

Person
Employee
Person*
Employee
Employee

출처 : http://en.wikipedia.org/wiki/Typeid

'Programming > C++ Language' 카테고리의 다른 글

static_cast 와 dynamic_cast  (0) 2015.01.07
warning 에 대하여  (0) 2015.01.07
Unique Pointer  (0) 2014.03.03
[C++] 동적바인딩( Dynamic binding )  (0) 2011.01.03
[C++] this 포인터 사용하기  (0) 2010.07.31

설정

트랙백

댓글