궁금증 연구소

안녕하세요. 궁금증연구소입니다.

오늘 포스팅 주제는 "c++ 생성자 호출 시점"입니다.

#include <iostream>
#include <cstring>

using namespace std;

struct Score
{
    char name[20];
    int score;

    // Score(){}
    Score(int score, const char *name){
        this->score = score;
        strcpy(this->name, name);
        cout <<"생성자 호출"<<endl;;
    }

    void view(){
        cout<< score << ' ' << name <<endl;
    }
};


main()
{
    Score a = Score(80,"hong"), b(90,"choi");

    a.view();
    b.view();

}

위 코드에서, 생성자는 두 번만 호출된다.

내 생각에는 기본 생성자를 만들어 놓지 않아서 에러가 날거라고 생각했다. 왜냐하면

Score a 객체를 만들어서 Score(80, "hong") 값을 복사한다고 생각했기 때문에 그렇지만 기본생성자를 만들어 놓아도 기본생성자 호출은 이루어지지 않는다.

 

 

#include <iostream>
#include <cstring>

using namespace std;

struct Score
{
    char name[20];
    int score;

    Score(){
        cout << "기본생성자 호출"<<endl;
    }
    Score(int score, const char *name){
        this->score = score;
        strcpy(this->name, name);
        cout <<"생성자 호출"<<endl;;
    }

    void view(){
        cout<< score << ' ' << name <<endl;
    }
};


main()
{
    Score a = Score(80,"hong"), b(90,"choi");

    a.view();
    b.view();

}

요렇게 기본 생성자를 만들어 두어도, 호출 결과는 생성자만 두 번 호출된다.

호출 결과

 

즉, Score a = Score(80, "hong")과 같은 형태의 객체 생성에는 한 번의 생성자만 생성된다는 것을 알 수 있다.

 

main()
{
    Score a ;
    Score(80,"hong"); 
    Score b(90,"choi");

    a.view();
    b.view();

}

메인 함수 부분을 이렇게 바꾸어 보았다. 결과는 아래와 같이 생성자가 3번 호출된다. a는 값이 초기화되지 않았으므로,

쓰레기 값이 출력된다.

결과 화면

2번 줄과 3번 줄의 차이는 2번은 그냥 생성자를 호출만 하였고, 3번 줄은 생성자를 호출한 값을 Score b 변수에 대입하였다.

즉 Score b = Score(90, "choi")와 Score b(90, "choi")는 같은 의미로, 결론적으로 생성자는 한 번만 호출된다.

 

즉 Score b = {70, "kim"} 형태의 초기화는 기본 생성자를 생성하지 않는다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading