#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;
}