42seoul/projects

[C++] Orthodox Canonical Form

moaoh 2021. 9. 14. 00:00

ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ง€์ผœ์•ผํ•˜๋Š” ์ •ํ†ต ํด๋ž˜์Šค ํ˜•์‹์„  ์ด์•ผ๊ธฐํ•œ๋‹ค.

  1. ๋””ํดํŠธ ์ƒ์„ฑ์ž(Default constructor)
  2. ๋ณต์‚ฌ ์ƒ์„ฑ์ž(Copy constructor)
  3. ํ• ๋‹น ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ(Copy assignment operator)
  4. ์†Œ๋ฉธ์ž(Destructor)


์ƒ์„ฑ์ž (Constructor)

ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน์ˆ˜ํ•œ ์ข…๋ฅ˜์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜

class Zombie
{
private:
    std::string name;
public:

    // ์ƒ์„ฑ์ž.
    Zombie(std::string _name = "no_name")
    {
        name = _name;
    }

    // ์†Œ๋ฉธ์ž.
    ~Zombie()
    {
        std::cout << name << "bye bye :D" << "\n";
    }
};

์ž…๋ ฅ๊ฐ’์ด ์—†์„๊ฒฝ์šฐ์— "no_name" ์ด ๋“ค์–ด๊ฐ€๊ณ  ์žˆ์„๊ฒฝ์šฐ์— ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” _name ์ด ๋“ค์–ด๊ฐ„๋‹ค.

 

 

 

๋ณต์‚ฌ ์ƒ์„ฑ์ž (Copy constructor)

๊ธฐ์กด์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒ์„ฑ ํ•˜๋Š” ํ•จ์ˆ˜

class Fixed
{
private:
	int		value;
	static const int integer = 8;
public:
	// **Copy constructor**
	Fixed( const Fixed& fixed );
};
Fixed a;
Fixed b(a);

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ a๋ฅผ ์ธ์šฉํ•˜์—ฌ b๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

 

 

 

๋ณต์‚ฌ ํ• ๋‹น ์ƒ์„ฑ์ž (Copy assignment operator)

์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜

class Fixed
{
private:
	int		value;
	static const int integer = 8;
public:
	// Copy assignment operator
	Fixed &operator = (const Fixed &other);

	~Fixed();
};
c = b;

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์กด์— ์ด๋ฏธ ์ƒ์„ฑ์ด ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด์— ๊ฐ’์„ ๋ฎ์–ด์”Œ์šฐ๋Š” ๋ฐฉ์‹

 

 

 

์†Œ๋ฉธ์ž (Destructor)

๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜

ํŠน์ง•

  • ์†Œ๋ฉธ์ž ์ด๋ฆ„์€ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ฐ™์•„์•ผ ํ•˜๊ณ  ์•ž์— ~๋ฅผ ๋‹ฌ์•„์•ผ ํ•œ๋‹ค.
  • ์†Œ๋ฉธ์ž๋Š” ์ธ์ˆ˜๊ฐ€ ์—†๋‹ค.
  • ์†Œ๋ฉธ์ž๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†๋‹ค.

์†Œ๋ฉธ์ž๋Š” ํด๋ž˜์Šค๋‹น 1๊ฐœ๋งŒ ์กด์žฌ ๊ฐ€๋Šฅ.

ํ•จ์ˆ˜์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ ์†Œ๋ฉธ์ž ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

class Zombie
{
private:
    /* data */
public:

    void announce(void)
    {
        std::cout << "{NAME} " << "BraiiiiiiinnnzzzZ..." << "\n";
    }

    // ์ƒ์„ฑ์ž.
    Zombie(/* args */);

    // ์†Œ๋ฉธ์ž.
    ~Zombie();
};

๊ฐ์ฒด๊ฐ€ delete fixed; ํ˜•์‹์œผ๋กœ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ•จ์ˆ˜๊ฐ€ ๋์ด๋‚˜๋ฉด ์†Œ๋ฉธ์ž ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.