cpp_Constructor - 8BitsCoding/RobotMentor GitHub Wiki

Disallow Functions

์šฐ์„  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋Š” Default Constructor๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Copy constructor
  2. Copy Assignment Operator
  3. Destructor
  4. Default constructor

์œ„ ๋„ค ๊ฐœ์˜ Constructor๋ฅผ ๋ง‰๋Š” ๋ฐฉ๋ฒ•(์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ž๋™์ƒ์„ฑ ๋จ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•.)์„ ์•Œ์•„๋ณด์ž.

Default Constructor ๋ง‰๊ธฐ


class OpenFile{

};

int main() {
    OpenFile f;
}

OpenFile์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ ํ›„ ํŒŒ์ผ์„ ์—ด๊ฒŒ ํ•˜๊ณ  ์‹ถ์€๋ฐ ์ƒ์„ฑ์ž๋กœ ํŒŒ์ผ์˜ ์ฃผ์†Œ๊ฐ’์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ์ด ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค.

์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?


class OpenFile{
public:
    OpenFile(string filename) {cout << "Open a file" << filename << endl;}
};

int main() {
    OpenFile f;
    // ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฐœ์ƒ
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜๋ฉด๋œ๋‹ค. ์–ด๋–ป๊ฒŒ ๋œ ๊ฒƒ์ธ๊ฐ€??? ๋‹ต์€ ๋ช…ํ™•ํ•œ ์ƒ์„ฑ์ž๋ฅผ ๋ช…์‹œํ–ˆ๊ธฐ์— ๊ธฐ์กด์˜ Default Constructor๊ฐ€ ์ƒ์„ฑ์ด ๋˜์ง€ ์•Š์€ ๊ฒƒ.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋˜๋‚˜?

Copy Constructor ๋ง‰๊ธฐ


int main() {
    OpenFile f(string("Bo_file"));

    OpenFile f2(f);
    // Copy Constructor๋Š” ์‚ด์•„์žˆ๋Š”๊ฐ€?
    // ์•„์ง๊นŒ์ง„ ์‚ด์•„์žˆ๋‹ค. (์ปดํŒŒ์ผ ๋จ.)
}

๊ทธ๋ ‡๋‹ค๋ฉด Copy Constructor๊นŒ์ง€ ๋ง‰๊ณ  ์‹ถ๋‹ค๋ฉด??


// ๋ฐฉ๋ฒ•1
// C++ 11 ์ด์ƒ์˜ ๋ฒ„์ „์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ.
class OpenFile{
public:
    OpenFile(string filename) {cout << "Open a file" << filename << endl;}
    OpenFile(OpenFile& rhs) = delete;
};

int main() {
    OpenFile f(string("Bo_file"));

    OpenFile f2(f);
    // Compile Error
}


// ๋ฐฉ๋ฒ•2
class OpenFile{
public:
    OpenFile(string filename) {cout << "Open a file" << filename << endl;}

private:
    OpenFile(OpenFile& rhs);
};

int main() {
    OpenFile f(string("Bo_file"));

    OpenFile f2(f);
    // Compile Error
}

Copy Assignment Operator ๋ง‰๊ธฐ


class OpenFile{
public:
    OpenFile(string filename) {cout << "Open a file" << filename << endl;}

private:
    OpenFile(OpenFile& rhs);
    OpenFile& operator=(const OpenFile& rhs);
    // ๋™์ผํ•˜๊ฒŒ private์— ์„ ์–ธํ•ด๋‘๋ฉด ๋ง‰์„ ์ˆ˜ ์žˆ์Œ.
};

Destructor ๋ง‰๊ธฐ


class OpenFile{
public:
    OpenFile(string filename) {cout << "Open a file" << filename << endl;}

private:
    OpenFile(OpenFile& rhs);
    ~OpenFile();
    // ์—ญ์‹œ private์— ์„ ์–ธํ•˜๋ฉด ๋ง‰์„ ์ˆ˜ ์žˆ์„๊นŒ?
    // Comfile Error๊ฐ€ ๋ฐœ์ƒ!
};

int main() {
    OpenFile f(string("foo"));
}

์™œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‚˜?? ์–ธ์  ๊ฐ€๋Š” ํด๋ž˜์Šค๊ฐ€ ์ฃฝ์–ด์•ผํ•˜๊ณ  Destructor๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ.. private์—์„œ๋Š” ํ˜ธ์ถœ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋Ÿผ ์Šค์Šค๋กœ ์ฃฝ๊ฒŒ ๋งŒ๋“ค๋ฉด ์•ˆ๋˜๋‚˜??


class OpenFile{
public:
    OpenFile(string filename) {cout << "Open a file" << filename << endl;}
    void destroyMe() {delete this};
    // ์Šค์Šค๋กœ ์ฃฝ๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ
    // ์—ญ์‹œ๋‚˜ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ ์œ„์™€ ๊ฐ™์€ ์ด์œ ...

private:
    OpenFile(OpenFile& rhs);
    ~OpenFile();
};

int main() {
    OpenFile f(string("foo"));
    f.destryoMe();
}

์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜??


class OpenFile{
public:
    OpenFile(string filename) {cout << "Open a file" << filename << endl;}
    void destroyMe() {delete this};

private:
    OpenFile(OpenFile& rhs);
    ~OpenFile();
};

int main() {
    OpenFile* f = new OpenFile(string("foo"));
    f->destryoMe();
    // OpenFile์„ Stack์— ์Œ“์ง€๋ง๊ณ  Heap์— ์Œ“์„ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
    // private์— ์†Œ๋ฉธ์ž๊ฐ€ ์žˆ์„๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์–ด๋„ ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•˜๊ธฐ์— Stack์— ์Œ“์„๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‚˜.
    // Heap์— ์Œ“์„ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๊ฐ€๋Šฅ, ๋‹จ destroyMeํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค˜์•ผ๊ฒ ์ง€?
}

์–ธ์ œ์“ฐ๋‚˜?? ์˜ค๋ธŒ์ ํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์„œ stack ์Œ“๊ธฐ ๋ถˆ์•ˆํ•œ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฒฝ์šฐ ์†Œ๋ฉธ์ž๋ฅด private์„ ์–ธํ•จ์œผ๋กœ์จ heap์— ์Œ“๋Š” ๊ฒƒ์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ์‚ฌ์ดํŠธ ์ฐธ๊ณ ์‚ฌ์ดํŠธ2