미누에요
[C++] 디폴트 생성자(Default Constructor) 본문
728x90
반응형
SMALL
디폴트 생성자(Default Constructor)
#include <iostream>
using namespace std;
class MyClass
{
private:
int num;
public:
// 생성자 없음!!!!
void SayHi()
{
cout << "Hi" << endl;
}
};
int main(void)
{
MyClass mc1; // 생성자를 통해 초기화하는 것이 아니라서 mc1(10)과 같은 형식이 아님
mc1.SayHi();
return 0;
}
만약에 위처럼 생성자를 사용하지 않고 클래스를 사용한다면 어떤 일이 일어날까 ?
결과는 아무런 오류가 일어나지 않는다.
이전 생성자 게시물에서, 객체가 되려면 무조건 하나의 생성자가 호출되야 한다고 했다.
그럼 왜 사용하지 않아도 프로그램에 에러가 발생하지 않는 것일까 ?
그 이유는 디폴트 생성자(Default Constructor)에 있다.
우리가 위처럼 생성자를 사용하지 않고 코드를 작성하면, 컴파일 과정에서 디폴트 생성자가 자동적으로 삽입된다.
#include <iostream>
using namespace std;
class MyClass
{
private:
int num;
public:
MyClass(){} // 디폴트 생성자 !!
void SayHi()
{
cout << "Hi"<<endl;
}
};
int main(void)
{
MyClass mc1; // mc1(10) 이 아닌 mc1 임!!!! (생성자가 없으니)
mc1.SayHi();
return 0;
}
따라서 위 코드처럼 컴파일 과정에서 MyClass(){} 라는 코드를 생성해주는 것이다.
물론 안의 내용은 비어있다. 형식상으로 생성되는 것이다.
위처럼 디폴트 생성자는 생성자가 하나도 없을때만 생성된다.
아래 코드를 보자.
#include <iostream>
using namespace std;
class MyClass
{
private:
int num;
public:
MyClass(int n) : num(n) {}
void SayHi()
{
cout << "Hi" << endl;
}
};
int main(void)
{
MyClass mc1(20);
MyClass *mc2 = new MyClass(31);
MyClass mc3; // 일치하는 생성자 없음!!
MyClass *mc4 = new MyClass; // 일치하는 생성자 없음!!
mc1.SayHi();
return 0;
}
위 코드를 실행하면 main 함수 내에서 mc3 와 mc4를 선언하는 부분에서 에러가 발생한다.
디폴트 생성자가 추가된다면 아무 문제없이 실행될 거 같지만, 디폴트 생성자(반환형과 인자가 void인 생성자)는 생성자가 하나도 없을 경우에만 추가된다.
위 코드에는 이미 MyClass(int n) : num(n) 이라는 생성자가 존재한다.
따라서 mc3와 mc4의 선언 과정에서 에러가 나지 않으려면 맞는 모양의 생성자를 하나 더 만들어주면 된다!!
생성자는 여러 개 만들어도 무방하다. (오버로딩)
#include <iostream>
using namespace std;
class MyClass
{
private:
int num;
public:
MyClass(int n) : num(n) {}
MyClass() : num(0) {} // 빈 생성자 추가! (num도 0으로 초기화해줌, 안해도 상관없다)
void SayHi()
{
cout << "Hi" << endl;
}
};
int main(void)
{
MyClass mc1(20);
MyClass *mc2 = new MyClass(31);
MyClass mc3;
MyClass *mc4 = new MyClass;
mc1.SayHi();
return 0;
}
위처럼 코드를 작성하면 mc3와 mc4같은 객체도 생성할 수 있게된다.
결과
728x90
반응형
LIST
'C++' 카테고리의 다른 글
[C++] 객체 배열, 객체 포인터 배열 (0) | 2024.03.25 |
---|---|
[C++] 소멸자(Destructor) (0) | 2024.03.24 |
[C++] 생성자(Constructor) (0) | 2024.03.17 |
[C++] 멤버 이니셜라이저(Member Initializer) (0) | 2024.03.17 |
[C++] 윤성우의 열혈 C++ 프로그래밍 Ch05-1 : 복사 생성자의 정의 문제풀이 (0) | 2024.03.16 |