Minwoo Dev.

[C++] 디폴트 생성자(Default Constructor) 본문

C++

[C++] 디폴트 생성자(Default Constructor)

itisminu 2024. 3. 17. 22:22
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