#include <iostream>
#include <cassert>
using namespace std;

class Fraction
{
private:
    int m_numerator;
    int m_denominator;
public:
    Fraction(char) = delete; // 지워버렸기 때문에 사용할 수 없다. 버전업을 하면서 사람들이 이렇게 쓸 것을 대비해서 못쓰게 막는 용도
    
    
    
    explicit Fraction(int num = 0, int den = 1) // => 뭔가 할 때 직접적으로 바꾸라는 뜻이다 
    	: m_numerator(num), m_denominator(den)
    {
        assert(den != 0);
    }
    
    Fraction(const Fraction &fraction) // copy constructor
        : m_numerator(fraction.m_numerator), m_denominator(fraciton.m_denominator)
        {
            cout << "Copy constructor called" << "\n"; //같은 타입의 instance가 들어오면 복사. 
        }
    
    friend std::ostream & operator << (std::ostream & out, const Fraction & f)
    {
        out << f.m_numerator << " / " << f.m_denominator << "\n";
        return out;
    }
};

Fraction doSomething(Fraction frac)
{
    cout << frac << "\n";
}

int main()
{
	// Fraciton frac('c') => 에러
    Fraction frac(7);
    
    doSomething(frac); // or doSomething(7)도 된다. (왜?) // 하지만 explicit을 붙이면 안됨. 직접 바꿔야 하기 때문
    
    
    
    
    
    
    
    return 0;
}