RTTI
RTTIλ 'runtime type identification'μ μ½μλ‘, μ€ν μκ° λ°μ΄ν°ν μ 보λΌλ λ»μ΄λ€. RTTIμ λͺ©μ μ νλ‘κ·Έλ¨μ΄ μ€ν λμ€μ κ°μ²΄μ λ°μ΄ν°νμ κ²°μ νλ νμ€ λ°©λ²μ μ 곡νλ κ²μ΄λ€.
RTTIμ λμ λ°©μ
c++λ RTTIλ₯Ό μ§μνλ μΈ κ°μ§ μμλ₯Ό κ°μ§κ³ μλ€.
- dynamic_cast μ°μ°μλ, κ°λ₯νλ€λ©΄ κΈ°μ΄ ν΄λμ€νμ μ§μνλ ν¬μΈν°λ‘λΆν° νμ ν΄λμ€νμ μ§μνλ ν¬μΈν°λ₯Ό μμ±νλ€. κ°λ₯νμ§ μλ€λ©΄, λ ν¬μΈν°μΈ 0μ 리ν΄νλ€.
- typeid μ°μ°μλ μ΄λ€ κ°μ²΄μ μ νν λ°μ΄ν°νμ μλ³νλ νλμ κ°μ 리ν΄νλ€.
- type_info ꡬ쑰체λ μ΄λ€ νΉλ³ν λ°μ΄ν°νμ λν μ 보λ₯Ό μ μ₯νλ€.
RTTIλ κ°μ ν¨μλ€μ κ°μ§κ³ μλ ν΄λμ€μ λν΄μλ§ μ¬μ©ν μ μλ€.
-dynamic_cast μ°μ°μ
dynamic_cast μ°μ°μλ ν¬μΈν°κ° μ§μνλ κ°μ²΄νμ΄ λ¬΄μμΈμ§ μλ €μ£Όμ§ μλλ€. κ·Έ λμ μ κ·Έ κ°μ²΄μ μ£Όμλ₯Ό νΉμ νμ ν¬μΈν°μ μμ νκ² λμ ν μ μλμ§ μλ €μ€λ€.
μ΄ μ°μ°μλ λ€μκ³Ό κ°μ΄ μ¬μ©λλ€. (pgλ μ΄λ€ κ°μ²΄λ₯Ό μ§μνλ€.)
Superb * pm = dynamic_cast<Superb *>(pg);
μ΄ μ½λλ ν¬μΈν° pgκ° Superb *νμΌλ‘ μμ νκ² λ³νλ μ μλ€λ©΄, κ·Έ μ°μ°μλ κ·Έ κ°μ²΄μ μ£Όμλ₯Ό 리ν΄νλ€. λ³νν μ μλ€λ©΄, λ ν¬μΈν°μΈ 0μ 리ν΄νλ€.
dynamic_castλ₯Ό μ°Έμ‘°μ ν¨κ» μ¬μ©ν μ μλ€.
λ ν¬μΈν°νμ ν΄λΉνλ μ°Έμ‘° κ°μ μ‘΄μ¬νμ§ μλλ€.
μ€ν¨λ₯Ό λνλ΄λλ° μ¬μ© κ°λ₯ν νΉλ³ν μ°Έμ‘°κ°μ΄ μλ€. κ·Έ λμ λΆμ μ ν μμ²μ΄ μ μλ λ, dynamic_castλ bad_cast νμ μμΈλ₯Ό λ°μμν¨λ€.
typeid μ°μ°μμ type_info ν΄λμ€
typeid μ°μ°μλ₯Ό μ¬μ©νμ¬ λ κ°μ²΄μ λ°μ΄ν°νμ΄ κ°μμ§ κ²°μ ν μ μλ€. λ μ’ λ₯μ 맀κ°λ³μλ₯Ό λ°μλ€μΈλ€.
- ν΄λμ€μ μ΄λ¦
- κ°μ²΄λ‘ νκ°λλ μ
typeid μ°μ°μλ type_info κ°μ²΄μ λν μ°Έμ‘°λ₯Ό 리ν΄νλ€. type_infoλ typeinfo ν€λ νμΌμ μ μλμ΄ μλ ν΄λμ€μ΄λ€. type_info ν΄λμ€λ λ°μ΄ν°νμ λΉκ΅νλ λ° μ¬μ©ν μ μλλ‘ ==μ != μ°μ°μλ₯Ό μ€λ² λ‘λ©νλ€. typeid(Magnificent)==typeid(*pg) //pgκ° Magnificent κ°μ²΄λ₯Ό μ§μνλ ν¬μΈν°μ΄λ©΄ trueλ‘ νκ°λλ€. pgκ° λ ν¬μΈν°μ΄λ©΄, νλ‘κ·Έλ¨μ bad_typeid μμΈλ₯Ό λ°μμν¨λ€.
λ°μ΄ν°ν λ³ν μ°μ°μ
λ°μ΄ν°ν λ³ν κ³Όμ μ λμ± μ격νκ² κ·μ νλ 4κ°μ λ°μ΄ν°ν λ³ν μ°μ°μλ₯Ό μΆκ°νμλ€.
- dynamic_cast
- const_cast
- stataic_cast
- reinterpret_cast
μΌλ°μ μΈ λ°μ΄ν°ν λ³νμ μ¬μ©νλ λμ μ, νΉμ λͺ©μ μ λ§λ μ°μ°μλ₯Ό μ νν μ μλ€.
const_cast μ°μ°μλ μ΄λ€ κ°μ constλ volatileλ‘ λλ κ·Έ λ°λλ‘ λ³κ²½νλ κ²μ΄ μ μΌν λͺ©μ μΈ λ°μ΄ν°ν λ³νμ μν κ²μ΄λ€. dynamic_cast μ°μ°μμ λμΌν λ¬Έλ²μ μ¬μ©νλ€.
const_cast<type_name>(expression)
type_nameκ³Ό expressionμ constλ volatileμ΄ μλλ μλλμ λ°λΌ λ¬λΌμ§λ κ²λ§ λΉΌκ³ λ, λ°μ΄ν°νμ΄ λμΌν΄μΌ νλ€.
const_castλ μ΄λ€ μμ λν ν¬μΈν°μ μ κ·Όμ λ³κ²½ν μ μμΌλ, constλ‘ μ μΈλ μμ λ³κ²½νλ €λ μλλ κ·Έ κ²°κ³Όκ° μ μλμ§ μλλ€.
static_cast μ°μ°μλ λ€λ₯Έ μ°μ°μλ€κ³Ό λμΌν λ¬Έλ²μ μ¬μ©νλ€. static_cast<type_name>(expression)
μ΄κ²μ type_nameμ΄ κ·Έ expressionμ΄ κ°μ§λ λ°μ΄ν°νμΌλ‘ μμμ μΌλ‘ λ³νλ μ μμ λμλ§ μ ν¨νλ€.
reinterpret_castμ°μ°μλ μνν λ°μ΄ν°ν λ³νμ νκΈ° μν κ²μ΄λ€.
reinterpret_cast<type_name>(expression)
μ΄ μ°μ°μμ μ¬μ© μμ΄λ€.
struct dat{short a; short b};
long value = 0xf224B118;
dat * pd = reinterpret_cast<dat *>(&value);
cout<<pd->a; // κ·Έ κ°μ μ²μ 2λ°μ΄νΈλ₯Ό μΆλ ₯νλ€.
string ν΄λμ€
λ¬Έμμ΄ μμ±
string μμ±μλ€μ λ¨Όμ μ΄ν΄λ³΄μ. ν΄λμ€μ κ΄ν΄ μμμΌ ν κ°μ₯ μ€μν κ²μ, κ·Έ ν΄λμ€μ κ°μ²΄λ₯Ό μμ±ν λ μ¬μ©ν μ μλ μ΅μ λ€μ΄λ€.
string ν΄λμ€μ μμ±μλ€
μμ±μ | μ€λͺ |
string(const char *s) | string κ°μ²΄λ₯Ό sκ° μ§μνλ NBTSλ‘ μ΄κΈ°ννλ€. |
string(size_type n,char c) | λ¬Έμ cλ‘ λͺ¨λ μ΄κΈ°νλ μμ nκ°μ string κ°μ²΄λ₯Ό μμ±νλ€. |
string(const string &str) | string κ°μ²΄λ₯Ό string κ°μ²΄ str(λ³΅μ¬ μμ±μ)λ‘ μ΄κΈ°ν νλ€. |
string() | ν¬κΈ°κ° 0μΈ λν΄νΈ string κ°μ²΄λ₯Ό μμ±νλ€. (λν΄νΈ μμ±μ) |
string(const char *s,size_type n) | string κ°μ²΄λ₯Ό sκ° μ§μνλ NBTSλ‘ μ΄κΈ°ννλ, NBTSμ ν¬κΈ°λ₯Ό μ΄κ³ΌνλλΌλ nκ°μ λ¬ΈμκΉμ§ μ§ννλ€. |
template<class Iter> string(Iterbegin,Iter end) |
string κ°μ²΄λ₯Ό [begin,end]μ λ²μμ μλ κ°λ€λ‘ μ΄κΈ°ννλ€. beginκ³Ό endλ ν¬μΈν°μ λΉμ·ν μν μ νμ¬ μμΉλ₯Ό μ§μ νλ€. κ·Έ λ²μλ beginμ ν¬ν¨νκ³ , endλ ν¬ν¨νμ§ μλ end λ°λ‘ μ κΉμ§λ₯Ό μλ―Ένλ€. |
string(const string & str,size_type pos,size_type n = npos) | string κ°μ²΄λ₯Ό string κ°μ²΄ strλ‘ μ΄κΈ°ννλ€. strμ μλ posμμΉμμ μμν΄μ strμ λκΉμ§ κ°κ±°λ, n λ¬Έμλ₯Ό μ¬μ©νλ strμ λμ λμ΄κ° μ μλ€. |
string(string &&str) noexcept | string κ°μ²΄λ₯Ό string κ°μ²΄ strλ‘ μ΄κΈ°ννλ€. strμ λ°λ μ μλ€.(move μμ±μ) |
string(initializer_list <char> il) | string κ°μ²΄λ₯Ό μ΄κΈ°ν λͺ©λ‘ ilμ μλ λ¬Έμλ‘ μ΄κΈ°ννλ€. |
NBTS(null-byte-terminated-string) : λ λ°μ΄νΈ μ’ λ£ λ¬Έμμ΄
λ°°μ΄μ μ΄λ¦κ³Όλ λ¬λ¦¬, string κ°μ²΄μ μ΄λ¦μ κ·Έ κ°μ²΄μ μ£Όμλ‘ κ°μ£Όλμ§ μλλ€.