νμν κ°λ μ 리
κΈ°λ³Έ κ·μΉ
Orthodox Canonical Form
module 02μ λ§μΉκ°μ§λ‘
- μμ±μ
- λ³΅μ¬ μμ±μ
- λ³΅μ¬ ν λΉ μμ±μ
- μλ©Έμ
μ΄ 4κ°μ§λ₯Ό ν¬ν¨νκ³ μμ΄μΌνλ€.
- include guards
- μ½λ λΆν μ μν΄ νμν κ²½μ° μΆκ°νμΌ μ¬μ©κ°λ₯
- C++ μμ newλ₯Ό μ¬μ©νλ©΄ λ©λͺ¨λ¦¬ λμκ° λ°μλ μ μκΈ°λλ¬Έμ λ©λͺ¨λ¦¬μ λν λμλ°©μ§λ₯Ό ν΄μ€μΌνλ€
ex00
endl κ³Ό ‘\n’ μ°¨μ΄μ
ex00μ λ€μ΄κ°κΈ°μ μμ κ°μκΈ° endlκ³Ό '\n'μ μ°¨μ΄κ° κΆκΈν΄μ Έμ μμ보κ²λμλ€. κ·Έλμ μμ보λ
std::cout << "hello" << std::endl;
std::cout << "world" << '\n';
μμ μΆλ ₯λλ λ λ¬Έμμ΄μ κ²½μ° μΆλ ₯κ°μ μλ‘ λκ°μ΄ λμ€κ²λλ€. νμ§λ§ λ΄λΆμ μΌλ‘ 보면 κΈ°λ₯μ μΈ λΆλΆμμ μ°¨μ΄μ μ΄ μκΈ°κ² λλλ°.
endl κ°μ κ²½μ°μλ ‘\n’κ³Όλ λ€λ₯΄κ² λ²νΌλ₯Ό λΉμ°λ μν μ κ°μ΄ μ§ννκ² λλ€.
λ¬Έμμ΄μ μΆλ ₯ν λμλ μΌμΌμ΄ λ°λ‘λ°λ‘ μΆλ ₯μ΄ λμ§μκ³ λͺ¨μλμλ€κ° λ²νΌλΌλ κ²μ μ¬μ©ν΄μ νλ²μ μΆλ ₯μ νκ² λλλ°
( λ²νΌλ₯Ό μ¬μ©νμ§μκ³ μΌμΌμ΄ μΆλ ₯μ νκ²λλ©΄ λ²νΌμ λͺ¨μμ μΆλ ₯νλ κ²λ³΄λ€ λλ¦¬κ² μΆλ ₯μ΄ λλ€. )
endlκ°μ κ²½μ°λ newline + λ²νΌλ₯Ό λΉμ°λ μν μ΄ λ μλΌκ³ μκ°μνλ©΄ λλ€.
ex01
κΈ°μ‘΄μ λ§λ€μ΄λμλ ClapTrapμ μμλ°λ ScavTrapμ μμ±ν΄μΌνλ€.
μμμ΄λ.
class A
{
public:
test();
}
class B : A
{
public:
hi();
// Aν΄λμ€λ₯Ό μμλ°μ ν΄λμ€μ΄κΈ°λλ¬Έμ Aν΄λμ€μ μλ testλ Bν΄λμ€μμ μ¬μ©κ°λ₯.
}
c++μμμ μμμ κΈ°μ‘΄μ ν΄λμ€(A)λ₯Ό μλ‘μ΄ ν΄λμ€(B)κ° μμμ λ°μμ Aμ μλ κ²λ€μ μ¬μ©ν μ μκ² λλ κ²μ΄ μμμ΄λΌκ³ μ΄μΌκΈ°λ₯Ό νλ€.
μ κ·Ό μ νμ μ€λͺ
private | μ€μ§ μμ μ ν΄λμ€μμμλ§ μ κ·Ό κ°λ₯ |
protected | μμ μ μμνλ ν΄λμ€κΉμ§λ§ μ κ·Ό κ°λ₯ |
public | μ΄λμλ μ κ·Ό κ°λ₯ |
μμμλ μμκ°μ΄ μ΄ 3κ°μ§μ μ κ·Ό μ νμκ° μλλ°.
( private < protected < public μμλ‘ μ κ·Ό λ²μκ° λλ€. )
#include <iostream>
class A
{
private:
int a;
protected:
int b;
public:
int c;
};
class B : public A
{
public:
void sum() {
a = 10; // NO : private error
b = 20; // OK
c = 30; // OK
}
void print() {
std::cout << a; // NO : private error
std::cout << b; // OK
std::cout << c; // OK
}
};
int main(void)
{
B b;
std::cout << b.a << std::endl; // NO : private error
std::cout << b.b << std::endl; // NO : protected error
std::cout << b.c << std::endl; // OK
return (0);
}
ν΄λμ€λ₯Ό μμλ°μ ν΄λμ€λ κΈ°μ‘΄μ ν΄λμ€μμ privateλ₯Ό μ μΈν λλ¨Έμ§ μ κ·Ό μ νμλ€μ μ¬μ©ν μ μλ€.
class A
{
private:
int a;
protected:
int b;
public:
int c;
};
class B : public A
{
// code
};
class C : protected A
{
// code
};
class D : private A
{
// code
};
μμ κ°μ νμμ²λΌ μμμ λ°μ λ κ·Έλ₯ μμμ λ°λκ²μ΄ μλλΌ μ κ·Ό μ§μ μλ₯Ό μ§μ ν΄μ μμμ λ°μ μ μλλ° ν΄μμ ν΄λ³΄μλ©΄
- class B : public A
public λ³΄λ€ μ κ·Ό λ²μκ° λμ κ²λ€μ public μ·¨κΈμ νκ² λ€λ μ΄μΌκΈ°μ΄μ§λ§ publicλ³΄λ€ μ κ·Ό λ²μκ° λμ κ²μ μκΈ° λλ¬Έμ μ κ·Ό λ²μ κ·Έλλ‘ μμμ λ°κ² λ€λ μλ―Έ - class C : protected A
protected λ³΄λ€ μ κ·Ό λ²μκ° λμ κ²λ€μ΄ protected μ²λ¦¬κ° λλ€ ( public ) - class D : private A
private λ³΄λ€ μ κ·Ό λ²μκ° λμ κ²λ€μ΄ private μ²λ¦¬κ° λλ€ ( public, protected )
virtual (κ°μν¨μ)
κ°μν¨μλ
λΆλͺ¨ν΄λμ€μμ μμλ°μ ν΄λμ€λ₯Ό μ¬μ μ ν κ²μ΄λΌκ³ μ μν΄λλ ν¨μ
class A
{
protected:
int a;
public:
virtual void print() {
std::cout << "this is class A" << std::endl;
}
};
class B : public A
{
public:
void print() {
std::cout << "this is class B" << std::endl;
}
};
int main(void)
{
A a;
B b;
a.print(); // this is class A
b.print(); // this is calss B
return (0);
}
μμ κ°μ΄ Aλ₯Ό μμλ°μ B ν¨μμμ κ°μ λ§€κ° ν¨μμ λ΄μ©μ λ³κ²½μ΄ νμν κ²½μ°μλ virtualμ ν¨μ μμ λΆμ¬
μ¬μ μν ν¨μλΌκ³ λͺ
μλ₯Ό ν΄μ£Όλ λ°©μμ΄λ€.
class A
{
public:
A() {
std::cout << "A Default constructor called" << std::endl;
}
~A() {
std::cout << "A Destructor called" << std::endl;
}
};
class B : public A
{
public:
B() {
std::cout << "B Default constructor called" << std::endl;
}
~B() {
std::cout << "B Destructor called" << std::endl;
}
};
int main(void)
{
B b;
return (0);
}
// print : A Default constructor called
// B Default constructor called
// B Destructor called
// A Destructor called
μμ κ°μ μ½λμμ Bμ κ²½μ°μλ Aλ₯Ό μμλ°μμ μμ±μ΄ λ μ½λμ΄κΈ°λλ¬Έμ class Bλ₯Ό μμ±νκ³ μλ©Ένλ κ³Όμ μμλ Aμ μμ±μμ μλ©Έμκ° λ λ€ μ€νμ΄ λλ€.
μ€νμ λ°©μμ²λΌ μ μ νμΆλ‘ λΆλͺ¨ → μμμμΌλ‘ μ€νμ΄ λκ³ μ’ λ£κ° λ λλ μμ → λΆλͺ¨μμΌλ‘ μ§νμ΄λλ€.
// μ§μ μ ν΄μ€ κ²½μ°
class A
{
protected:
std::string name;
public:
A() {
std::cout << "A Default constructor called" << std::endl;
}
A(std::string name) {
this->name = name;
std::cout << name << " Default constructor called" << std::endl;
}
~A() {
std::cout << "A Destructor called" << std::endl;
}
};
class B : public A
{
public:
B() {
std::cout << "B Default constructor called" << std::endl;
}
B(std::string name) : A(name) {
this->name = name;
std::cout << name << " Default constructor called" << std::endl;
}
~B() {
std::cout << "B Destructor called" << std::endl;
}
};
int main(void)
{
B b("Hi");
return (0);
}
// print : Hi Default constructor called
// Hi Default constructor called
// B Destructor called
// A Destructor called
νΉλ³ν κ°μ λ°λ μμ±μμ κ²½μ°μλ μ΄λ ν μμ±μλ₯Ό μμλ°μμ μ€νμ ν κ²μΈμ§λ₯Ό λ°λ‘ μμ ν΄λμ€μμ μ§μ μ ν΄μ€μΌνλ€. μ΄ μμ μ νμ§μμΌλ©΄ μμμ λ°μ μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ κΈ°λ³Ένμ μμ±μκ° μ€νμ΄ λλ€.
// μ§μ μ μν΄μ€ κ²½μ°
class A
{
protected:
std::string name;
public:
A() {
std::cout << "A Default constructor called" << std::endl;
}
A(std::string name) {
this->name = name;
std::cout << name << " Default constructor called" << std::endl;
}
~A() {
std::cout << "A Destructor called" << std::endl;
}
};
class B : public A
{
public:
B() {
std::cout << "B Default constructor called" << std::endl;
}
B(std::string name) {
this->name = name;
std::cout << name << " Default constructor called" << std::endl;
}
~B() {
std::cout << "B Destructor called" << std::endl;
}
};
int main(void)
{
B b("Hi");
return (0);
}
// print : A Default constructor called
// Hi Default constructor called
// B Destructor called
// A Destructor called
ex02
ex01μ μ΄νλλ¬Έ, ClapTrapμ μμλ°λ FragTrapμ μμ±ν΄μΌνλ€.
ex01κ³Ό λ€λ₯Έμ μ void attack( const std::string& target ); μ κ°μν¨μλ‘ λ°μ§μκ³ ,
construction/destructionμ void highFivesGuys(void); λ₯Ό μμ±νλ©΄ λλ€.
'42seoul > projects' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++] Inheritance ( μμ ), polymorphism ( λ€νμ± ) (0) | 2023.09.02 |
---|---|
[C++] operator overloading ( μ°μ°μ μ€λ²λ‘λ© ) operator overriding ( μ°μ°μ μ€λ²λΌμ΄λ© ) (0) | 2023.09.02 |
[CPP Module] 02 (0) | 2023.07.25 |
[CPP Module] 01 (1) | 2021.09.16 |
[CPP Module] 00 (3) | 2021.09.15 |