cpp_Constructor - 8BitsCoding/RobotMentor GitHub Wiki
Disallow Functions
์ฐ์ ์ปดํ์ผ๋ฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑํด ์ฃผ๋ Default Constructor๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Copy constructor
- Copy Assignment Operator
- Destructor
- 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์ ์๋ ๊ฒ์ ๊ฐ์ ํ ์ ์๋ค.