: λ°ν λ°λ νμ
μ λ°λΌμ glvalueλ‘ μΈν΄ κ·Έλ₯ μ°Έμ‘° μ²λΌ λ°μν μ§?
rvalueλ‘ μΈν΄ μ΄λ μ²λ¦¬ν μ§? μ λν μμκ° μλ€.
ν΄λμ€μμμ κ° λ³νμ μμ κ°μ²΄λ₯Ό λ§λλ κ²μ
μ°Έμ‘° νμ λ³νμ κΈ°μ‘΄ κ°μ²΄μ λ©λͺ¨λ¦¬λ₯Ό κ·Έλλ‘ μ¬μ©.
κ° μΊμ€ν
μ 볡μ¬κ° λ°μνλ κ²μ νμΈν μ μλ€.
μ°Έμ‘° μΊμ€ν
μ λ³΅μ¬ λ°μνμ§ μλλ€.
-> κ·Έλ°λ° λ°λ κ°μ²΄μ νμ
μ΄ value μΈ κ²½μ°, μ°Έμ‘° μΊμ€ν
μ΄λλΌλ
볡μ¬κ° λ°μνλ€. : μ€νν΄λ΄.
: μ??? λλ??? λ€μ΄λ² λΈλ‘κ·Έ xvalue μ°Έκ³ .
-> μ¬κΈ°μλ glvalueμ νΉμ±μ κ°μ§κ³ μλ κ²μ΄λ€.
: rvalueλ νλ² μ΄κΈ°νλλ©΄ , lvalue νΉμ±μ κ°μ§κ² λλλ°, μ¬κΈ°μλ
lvalue μ°Έμ‘°λ‘ λ°μν΄μ 볡μ¬, μ΄λ λ°μνμ§ μμ.
μλ₯Ό ν΅ν΄μ rvalue μ°Έμ‘° λ°νμ xvalue λΌκ³ νλλ°,
λ°ν λ°λ νμ λ μ€μνλ€.
bλ₯Ό μΌλ° value νμ
μΌλ‘ λ³κ²½νλ©΄, μ΄λμ΄ μ΄λ£¨μ΄μ§λ€.
μ¦, move ν¨μμ κ²½μ°λ λ°νλ°λ νμ
μ μν₯μ λ°λλ€.
λ°νλ°λ νμ
μ΄ &&μ°Έμ‘°λΌκ³ νλ€λ©΄, νλμ & lvalue μ°Έμ‘°λ‘ μΈμνκ³ ,
λ°νλ°λ νμ
μ΄ value λΌκ³ νλ€λ©΄, moveκ° μ΄λ£¨μ΄μ§λ€.
μμμμμ λΆλͺ¨λ‘μ νλ³νμ μ΄λ€ νμ΄λ λ¬Έμ μμ
: λΉμ°ν κ²°κ³Ό (λ©λͺ¨λ¦¬ ꡬ쑰μμ μμμ λΆλͺ¨μ λ©λͺ¨λ¦¬λ₯Ό ν¬ν¨)
but, λΆλͺ¨μμμ μμμΌλ‘μ νλ³νμ κ²½μ°, κ°λ³νμ λΆκ°ν¨.
-> μ΄λλ μ£Όμκ° μλλ―λ‘, λ©λͺ¨λ¦¬ ꡬ쑰λ₯Ό λ°λΌλ΄.
μ°Έμ‘° λ³νμ κ²½μ°, ν΄λμ€μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό ν΅ν λμ μ΄κΈ° λλ¬Έμ κ°λ₯ν¨.
κ·Όλ° μμμ λ©€λ² μ°Έμ‘°μ λ―Έμ μ λμ λ°μν¨. κ°λ°μκ° μμμ...
static_cast
: μμ νμ§ μμ. μμ μ± λ¬Έμ λ κ°λ°μκ° μμμ ν΄.
dynamic_cast
: μμ ν¨. λ°νμ λΉμ©μκΈ° λλ¬Έμ λλ¦Ό. νμ 체ν¬λ μ»΄νμΌλ¬κ° ν¨.
-> μ¬κΈ°μμ νμ 체ν¬λ κ°μν μ΄λΈμ μλ€. funcda c++ μ± μ μμ.
: c++ νΉλ³ν p.170
μ»΄νμΌλ¬λ void ν¬μΈν°κ° μ΄λ€ κ°μ²΄μ μ 보λ₯Ό κ°μ§κ³ μλμ§ μμ μκΈ° λλ¬Έμ μμ°Έμ‘°, μ¦κ°μ°μ° λ±μ λΆκ°ν¨.
κ·Έλμ λ°λμ μν νμ μΌλ‘ λ³νν΄μΌ ν¨.
κ·Έλ₯ μ£Όμκ°λ§ μκ³ μμ λΏ.. λ΄κ° κ°λ¦¬ν€λ λ©λͺ¨λ¦¬ μ£Όμμ μλ λ°μ΄ν°κ° λͺλ°μ΄νΈμ μλ κ°μΈμ§ μ μ μλ€...
: c++μ 4κ°μ§ μΊμ€ν λ°©λ².
μλμ λ²νΈμ ν΄λΉν¨.
1. μ μμ μ€μ μ¬μ΄μ νλ³ν : int <-> double
: μ€μμ κ²½μ°, λΆλμμμ μλ¦Ό.
2. μ΄κ±°νκ³Ό μ μ μ¬μ΄μ νλ³ν
3. void*λ₯Ό λ€λ₯Έ νμ
μ ν¬μΈν°λ‘.
μμ : mallocλ‘ λμ ν λΉν νμ ν¬μΈν° λ³μμ μ°Έμ‘°ν λ .
- but, λ€λ₯Έ νμ μ ν¬μΈν° λΌλ¦¬μ static_castλ λΆκ°ν¨.
- bindμ 2λ²μ§Έλ sockaddrλ‘ ν¬μΈν° νλ³νμ ν΄μΌνλ―λ‘, μ΄λλ reinterpret_castλ‘
μΊμ€ν ν΄μΌ ν¨.
μ£Όμν μ .
- μλ μμμ½λλ₯Ό ν΅ν΄ μ μ μλ―μ΄ λ€λ₯Έ ν¬μΈν° <-> λ€λ₯Έ ν¬μΈν°λ λΆκ°ν¨.
: reinterpret μμ κ°λ₯ν¨
void foo(int) {}
int main()
{
auto p2 = static_cast<void(*)(int)>(&foo);
p2(0); // νΈμΆνκΈ°
}
6. μμκ΄κ³μμ λ€μ΄μΊμ€ν
λ κ°λ₯ν¨.
- dynamic_cast λ³΄λ€ μλ λΉ λ¦. but μμ νμ§ μμ.
-> λ§μ§λ§ 50λ²μ₯μμ κ΄λ ¨ μ½λ μμ.
7. μ°κ΄μ± νλλ μλ ν΄λμ€ λΆκ°ν¨.
8. λ³ν μ°μ°μ ν¨μλ₯Ό λ§λ λ€λ©΄ κ°λ₯ν¨.
μμΈ : μ μ ν μμ±μ A(const& B ) νμμΌλ‘ λ§λ€μ΄μ€λ€λ©΄,
A a = b; κ°λ₯
9. κ° νμμ λ€μ΄μΊμ€ν
λΆκ°ν¨.
: κ°μ μ±μ κ°μ§κ³ μμ.
κ°) μλ‘ λ€λ₯Έ ν¬μΈν° λΌλ¦¬μ νλ³νμ.
λ) μ μμ ν¬μΈν° μ¬μ΄μ νλ³ν.
: ν¨ν·μ§λ ¬ν μμ μ¬μ©!
-> BufferReader / BufferWrite ν΄λμ€μ μννΈ μ°μ°μ μ€λ²λ‘λ© ν¨μμμμ μμ μ½λ.
-> μ΄ λλ μ°Έμ‘°ν κ²½μ° λ―Έμ μ λμ λ°μ.
μ½λ
: μ΄μ μκ°μ double* κ³Ό int νλ³νμ ν΄λ³΄μ.
-> ν΄κ²°λμ§ μμ.
κ²°λ‘
: λ€λ₯Έ νμ
μ ν¬μΈν°λ‘μ νλ³νμ νμ§ λ§μ!
μλ κ·Έλ¦Όμ 보면, n μ λ°μ΄ν°κ° λ§κ°μ§λ κ²μ νμΈν μ μμ.
: ν¬μΈν° μ ref λ³μμ μμμ±(const)κ³Ό volatileμ
μ κ±°νλ νλ³ν. (μΌλ° const λ³μλ μ£Όμκ°μΌλ‘ μμ±ν΄μΌ ν¨.)
μ€μ!
- const_cast ν¬μΈν° μμ°Έμ‘°λ‘ μμ λΆκ°ν¨.
:κ²°κ³Όκ° λͺ¨μ λ©μ΄λ¦¬λ€....
μλ μλ κ²°κ³Όλ₯Ό ν΅ν΄μ μΊμ€ν μ νκ²λλ©΄ μμκ°μ²΄κ° μμ±λ¨μ νμΈν μ μμ.
const κ°μ μ§μ§ λ³κ²½νκΈ° μν΄μλ ν¬μΈν° λ³μλ‘ μμ°Έμ‘°νλ κ²μ΄ μλλΌ, ν΄λΉ constλ³μλ₯Ό λ€μ΄λ νΈλ‘ const_castν΄μ λ°λ‘ λ³κ²½ν΄μΌ ν¨.
const ν¬μΈν°μ κ²½μ° μμ μ½λ
-> μ§μ§ cλ₯Ό λ°κΎΈκΈ° μν΄μλ μλμ κ·Έλ¦Όμ²λΌ cμ μ§μ μ κ·Όν΄μΌ ν¨.
λ°νμ μ νμ 체ν¬λ₯Ό νλ νλ³ν.
λ€μ΄ μΊμ€ν κ΄κ³μμ νμ μ²΄ν¬ νλ μ©λλ‘ μ¬μ©.
μ
μΊμ€ν
λ ν¬μΈν°λ₯Ό μΈμλ‘ μ λ¬ν΄μΌ μ¬λ°λ₯Έ λ°νκ°μ μ»μ μ μμ.
Base (ν¬μΈν°)base = new derived; -> μ΄κ±°λ λΉμ°μ
derived (ν¬μΈν°) dd = dynamic_cast<derived >(base );
: μλνλ©΄ base ν¬μΈν°λ derivedμ λ©λͺ¨λ¦¬λ₯Ό μκ³ μκΈ° λλ¬Έμ
μΆκ° 쑰건
: λ°λμ virtual ν¨μκ° μμ΄μΌ ν¨.
-> μ€νμκ°μ μ²λ¦¬νκΈ° μν¨.
https://velog.io/@kwt0124/rtti
: ν¬μΈν° κ°μ²΄κ° νμ κ°μ²΄μ μνλμ§ νμΈν λ μ¬μ©ν¨.
μλ₯Ό λ€λ©΄, νλ μ΄μ΄κ° μΆ©λμ²λ¦¬ νλ €κ³ νλλ°, μ λ°©μ μλ κ²μ΄ λͺ¬μ€ν°μΌ λ hp κ°μνλ λμμ ꡬννκ³ μ ν λ, μ λ°©μ μ€λΈμ νΈκ° λͺ¬μ€ν°μΈμ§, μ₯μ λ¬ΌμΈμ§ ?
-> μ΄ λ dynamic_cast λ₯Ό νμ©νλ λ°©λ²μ΄ μμ.
: μ΄ λ λ°λμ ν΄μΌν κ²μ΄ λͺ¨λ μ€λΈμ νΈλ₯Ό κΈ°λ° μΌλ‘ νλ ν΄λμ€κ° μμ΄μΌ ν¨.
static_cast<λ³ννκ³ μ νλ νμ >(κ°μ²΄λͺ μ΄λ λ³μλͺ )
κ°) μμ λ΄μ©μ ν λλ‘ μ½λ©νλΌ.
double d = 3.7;
int n = static_cast<int>(d);
int *p = static_cast<int*>(malloc(sizeof(int)));
int *p2 = static_cast<int *>(&d); // error
const int c = 10;
int *p3 = static_cast<int *>(&c); // error
λ) reinterpret_cast
int n = 10;
double * p1 = &n; // error : λΆκ°ν¨.
double * p2 = static_cast<double *>(&n);
// error : staticμΌλ‘λ λΆκ°.
double *p3 = reinterpret_cast<double *>(&n);
// ok : reinterpretμΌλ‘ κ°λ₯.
// μ μμ ν¬μΈν° μ¬μ΄μ λ³ν
int *p4 = 10; // error : μ£Όμκ° 10μ μ΅μ§λ‘ λ£κ³ μΆλ€λ μμ§μ.
int *p5 = reinterpret_cast<int *>(10); // ok
double d2 = n; // ok : μμμ νλ³ν κ°λ₯ν¨. // μ μκ° νλ³ν.
double d3 = reinterpret_cast<double>(n);
// error : reinterpret_castμ μ©λμ λΆν©νμ§ μμ.
λ€) const_cast
const int c = 10;
volatile int v = 20;
int n = c; // ok
//int* p = &c;
// error : μλ‘ μμ ν λ€λ₯Έ νμ
μ΄λ―λ‘, μμμ νλ³ν λΆκ°ν¨.
int* p2 = const_cast<int*>(&c);
// ok : cμ μμμ±μ μ κ±°ν¨!
int* p3 = reinterpret_cast<int*>(&c);
// error : reinterpret_cast λ const μμ±μ΄ μμΌλ©΄ ν¬μΈν°λΌλ λΆκ°ν¨.
double* p4 = const_cast<double*>(&c);
// error : const_castλ μμμ±λ§ μ κ±°ν μ μμ.
double* p5 = reinterpret_cast<double*>(const_cast<int*>(&c));
λΌ) const int ν λ³μμ μ£Όμλ₯Ό char*λ³μμ λ£μ΄λΌ.
- 2κ°μ§ λ°©λ²μ΄ μμ.
1) reinterp -> const_cast
2) const_cast -> reinterp