Orthodox Canonical Form
- ๊ธฐ๋ณธ ์์ฑ์
- ๊ธฐ๋ณธ ์๋ฉธ์
- ๋ณต์ฌ ์์ฑ์
- ํ ๋น ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ
class A
{
A();
~A();
A(const A &a);
A &operator= (const A &a);
};
๋ณต์ฌ์์ฑ์
๋ฐ๋ก ์ ์ํด์ฃผ์ง ์์๋ default ๋ณต์ฌ์์ฑ์ ์กด์ฌํจ
๊ทธ๋ฐ๋ฐ deep copy๊ฐ ์๋ shallow copyํจ
#include <iostream>
class A {
private:
int *n;
public:
A() {
n = new int(0);
}
int getN(){
return *n;
}
void setN(int num) {
*n = num;
}
};
int main(void)
{
A a;
A b(a);
std::cout << a.getN() << std::endl;
std::cout << b.getN() << std::endl;
a.setN(2);
std::cout << a.getN() << std::endl;
std::cout << b.getN() << std::endl;
}
(console)
0
0
2
2
ํด๋์ค์์ ๋์ ํ ๋น์ผ๋ก ์ด๊ธฐํ๋๋ ๊ฐ์ด ์๋ค๋ฉด ๋ณต์ฌ ์์ฑ์๋ฅผ ์ง์ ์ ์ํด๋์ด์ผ ํจ! ์๊ทธ๋ผ ๋์ค์ ํ ๋นํด์ ์์ ๋๋ฒ ํด์ ๋์ด ๋ฐํ์ ์๋ฌ ๋ฐ์ํจ.
#include <iostream>
class A {
private:
int *n;
public:
A() {
n = new int(0);
}
~A() {
delete n;
}
int getN(){
return *n;
}
void setN(int num) {
*n = num;
}
};
int main(void)
{
A a;
A b(a);
std::cout << a.getN() << std::endl;
std::cout << b.getN() << std::endl;
a.setN(2);
std::cout << a.getN() << std::endl;
std::cout << b.getN() << std::endl;
}
(console)
0
0
2
2
a.out(33859,0x11d4bb600) malloc: *** error for object 0x600003bdc030: pointer being freed was not allocated
a.out(33859,0x11d4bb600) malloc: *** set a breakpoint in malloc_error_break to debug
zsh: abort
๋ณต์ฌ ์์ฑ์ & ๋์ ์ฐ์ฐ์
class ClapTrap {
private:
std::string _name;
unsigned int _hitpoints;
unsigned int _energypoints;
unsigned int _attackdamage;
public:
ClapTrap();
ClapTrap(std::string name);
ClapTrap(const ClapTrap& claptrap);
ClapTrap &operator=(const ClapTrap &claptrap);
~ClapTrap();
}
ClapTrap::ClapTrap(const ClapTrap& claptrap) { // 1. ์ธ์๋ก &๋ฅผ ๋ฃ๋ ์ด์
*this = claptrap; //2. ์ ์ด๋ ๊ฒ?
std::cout << _name << " copy constructor called" << std::endl;
}
ClapTrap &ClapTrap::operator=(const ClapTrap &claptrap) { //3. ์ฌ๊ธฐ์ ref๋ฅผ ๋ฐํํ๋ ์ด์
if (this != &claptrap) { // 4. ์ด if ๋ฌธ์ด ์กด์ฌํ๋ ์ด์
//5. ์ฌ๊ธฐ์ *this = claptrap; ์ ์ํ๋ ์ด์
_name = claptrap._name;
_hitpoints = claptrap._hitpoints;
_energypoints = claptrap._energypoints;
_attackdamage = claptrap._attackdamage;
}
return *this;
}
//6. ๋์ ์ค์ํ ์ฐจ์ธ๋ ์ด๋ฏธ ์์ฑ๋ ๊ณณ์ ๋ฃ๋๋(=) ์์ฑ๋์ง ์์ ๊ณณ์ ๋ฃ๋๋(๋ณต์ฌ ์์ฑ์)
์ธ์๋ก ref๋ฅผ ๋ฃ๋ ์ด์ ๋ ์ธ์์ ๊ทธ๋ฅ class๋ฅผ ๋ฃ๊ฒ ๋๋ฉด ์ธ์คํด์ค๋ฅผ ๋ณต์ฌํ ํ ๋ฃ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ ์์ฑ์๋ฅผ ๋ฌดํํ ํธ์ถํ๊ฒ ๋จ.
*this = claptrap; ์ ํ๋ฉด shallow copy ์ด์ง๋ง ํ ๋น๋ ๊ฒ์ด ์๋ ๋ฉค๋ฒ๋ณ์๋ค๋ง ๊ฐ์ง๊ณ ์๋ค๋ฉด ์๊ด์์
operator chaining์ ํ์ฉํ๊ธฐ ์ํจ์ด๋ค. a = b = c = d =โฆ;
์๋
// ์ฐ์ฐ์๊ฐ ๋์ํ๋ ๋ฐฉ์ // 1. Class ๋ด์์ ์ฌ์ฉ์ค์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๊ณ // 2. ๋์ ํด์ค๋ ์ฐํญ์ ๊ฐ์ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋กญ๊ฒ ํ ๋นํ๋ค. // 3. ์ฐํญ์ ๊ฐ์ ์๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํ๋ค. // 4. *this ๋ฅผ ๋ฐํํ๋ค. if ๋ฌธ์ ์ฐ์ง ์์ผ๋ฉด ํ ๋น ํด์ ํ ๊ฒ์ ๋ค์ ์ ๊ทผํ๊ฒ ๋๋ ๋์ฐธ์ฌ!!
operator=๊ฐ ๋ฌดํํ ํธ์ถ๋๊ธฐ ๋๋ฌธ!
๋์ ์ฐ์ฐ์๋ ์ด๋ฏธ ์กด์ฌํ๋ ์ธ์คํด์ค ๋๊ฐ ์ฌ์ด์์ ์ผ์ด๋๋ ์ผ, ๋ณต์ฌ ์์ฑ์๋ ํ๋๋ ์กด์ฌ ํ๋๋ ์ ์กด์ฌํ๋ ์ํ์์ ์ผ์ด๋๋ ์ผ์. ๊ทธ๋์
ClapTrap A = B;
์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํํ๊ฒ ๋๋ฉด ๋ณต์ฌ์์ฑ์๊ฐ ํธ์ถ๋จ !!!
'๐ฐ42์์ธ > CPP_Module' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
CPP_Module_01 ๊ฐ์ฒด ๋ฐฐ์ด ์์ฑ, ํฌ์ธํฐ์ ๋ ํผ๋ฐ์ค ํ์ , ํจ์ํฌ์ธํฐ, fstream (0) | 2022.12.24 |
---|---|
CPP_Module_00 (0) | 2022.12.20 |