본문 바로가기

[C,C++]

[C,C++ 개념정리] Constructors(생성자)

728x90

 < Ellipsis, 생략부호Constructors(생성자) >

 

C++은 class내에 default-constructor가 존재한다. 새롭게 constructor를 정의하였다면 그 정의에 맞게 instance들을 생성하여야 한다.

신기하게도 constructor를 private하게 선언하는 경우도 있다고 한다. 추후에 포스팅하기로 한다.

 

- 코드 - 

/*
    <2020.04.07>

    [8.3강 생성자(Constructors)]

    컴파일러 입장에서 생성자가 없다면, default 생성자를 만들어서 넣어준다.
    생성자 : instance를 직접 생성한다기보다, 인스턴스를 선언할때 호출되는 '함수'개념에 더 가깝다.
*/

#include <iostream>
using namespace std;

class Fraction
{
private:
    int m_numerator;
    int m_denominator;

public:
    // Fraction() // 기본 디폴트 생성자.
    // Fraction() // 외부에서 호출하는 것이 아니라 자연적으로 실행되는 것이다.
    // {
    //     m_numerator = 0;
    //     m_denominator = 1;

    //     //cout << "Fraction() constructor " << endl;
    // }

    // 생성자를 직접 선언하면 기본생성자가 선언이 안된다.
    //  Fraction(const int& num_in = 1, const int& den_in =2 ) // 이렇게도 가능
    Fraction(const int& num_in, const int& den_in) // 외부에서 호출하는 것이 아니라 자연적으로 실행되는 것이다.
    {
        m_numerator = num_in;
        m_denominator = den_in;

        //cout << "Fraction() constructor " << endl;
    }

    void print()
    {
        cout << m_numerator << " / " << m_denominator << endl;
    }    
};

// 두번째 예제.
class Second
{
public:
    Second()
    {
        cout << "class second constructor()" << endl;
    }
};

class First
{
    Second sec;

public:
    First()
    {
        cout << "class first constructor()" << endl;
    }
};


int main()
{
    // Fraction frac;          
    // frac.m_numerator = 0;      -> 이런식의 접근은 private, 즉 encapsulation을 유지할 수 없다.
    // frac.m_denominator = 1;

    //Fraction frac; // 생성자에 파라미터가 없는 경우에는 ()괄호를 빼줘햐 한다!!
    //frac.print();

    Fraction one_thirds(1,5);
    one_thirds.print(); 

    // 위와 같은 상황에서는 별도의 생성자가 선언이 된 경우이므로,
    // Fraction frac;
    // frac.print()  -> 이렇게 사용하면, frac인스턴스에 직접 생성한 생성자의 규칙이 적용되므로, 파라미터가 없어 에러가 난다.
    // 이렇게 사용하려면,   1) 디폴트 생성자를 선언하거나, 
    //                  2) 함수오버로딩때 디폴트 파라미터를 사용한다.
 
    // Fraction one_thirds = Fraction{1,3}; 이런 방식의 대입도 가능하나 줄여쓰는게 편하므로 권장하지 않는다.

    // 이 두가지의 차이점은?? 
    // Fraction one_thirds{1,2}; -> 멤버들이 퍼블릭일때는 uniform - initialization 선언가능, 타입변환 지원X. 좀더 엄격하다.
    // Fraction one_thirds(1,3); -> 타입변환에 warning이 뜨지만 실행은 가능하다.

    First fir; // 실행시에는 second가 먼저 실행되고, first가 실행된다. 당연한 얘기지만^^

    return 0;
}

 

 - 출력 결과 -

728x90