๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿฐ42์„œ์šธ/CPP_Module

[CPP_Module] Orthodox Canonical Form : ๊ธฐ๋ณธ์ƒ์„ฑ์ž, ๋ณต์‚ฌ์ƒ์„ฑ์ž, ํ• ๋‹น์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ, ์†Œ๋ฉธ์ž

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. ๋‘˜์˜ ์ค‘์š”ํ•œ ์ฐจ์ธ๋Š” ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ณณ์— ๋„ฃ๋Š๋ƒ(=) ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ๊ณณ์— ๋„ฃ๋Š๋ƒ(๋ณต์‚ฌ ์ƒ์„ฑ์ž)
  1. ์ธ์ž๋กœ ref๋ฅผ ๋„ฃ๋Š” ์ด์œ ๋Š” ์ธ์ž์— ๊ทธ๋ƒฅ class๋ฅผ ๋„ฃ๊ฒŒ ๋˜๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์‚ฌํ•œ ํ›„ ๋„ฃ๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋ฅผ ๋ฌดํ•œํžˆ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ.

  2. *this = claptrap; ์„ ํ•˜๋ฉด shallow copy ์ด์ง€๋งŒ ํ• ๋‹น๋œ ๊ฒƒ์ด ์—†๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜๋“ค๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ƒ๊ด€์—†์Œ

  3. operator chaining์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. a = b = c = d =โ€ฆ;

  4. ์•„๋ž˜

    // ์—ฐ์‚ฐ์ž๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹ 
    // 1. Class ๋‚ด์—์„œ ์‚ฌ์šฉ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  
    // 2. ๋Œ€์ž…ํ•ด์˜ค๋Š” ์šฐํ•ญ์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ํ• ๋‹นํ•œ๋‹ค. 
    // 3. ์šฐํ•ญ์˜ ๊ฐ’์„ ์ƒˆ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ณต์‚ฌํ•œ๋‹ค. 
    // 4. *this ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 
    if ๋ฌธ์„ ์“ฐ์ง€ ์•Š์œผ๋ฉด ํ• ๋‹น ํ•ด์ œํ•œ ๊ฒƒ์„ ๋‹ค์‹œ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋Š” ๋Œ€์ฐธ์‚ฌ!!
  5. operator=๊ฐ€ ๋ฌดํ•œํžˆ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ!

  6. ๋Œ€์ž…์—ฐ์‚ฐ์ž๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ธ์Šคํ„ด์Šค ๋‘๊ฐœ ์‚ฌ์ด์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ, ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋Š” ํ•˜๋‚˜๋Š” ์กด์žฌ ํ•˜๋‚˜๋Š” ์•ˆ ์กด์žฌํ•˜๋Š” ์ƒํƒœ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์ž„. ๊ทธ๋ž˜์„œ ClapTrap A = B; ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณต์‚ฌ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋จ !!!