IT 프로그래밍/C++

[따배시C++] 8.3 생성자

기술1 2024. 4. 10. 20:02
반응형
#include <iostream>
using namespace std;

class Fraction
{
public:
	int m_numerator;
	int m_denominator;
	
public:
	void print()
	{
		cout << m_numerator << " / " << m_denominator << endl;
	}
};

int main()
{
	Fraction frac;
	frac.m_numerator = 0;
	frac.m_denominator = 1;

	frac.print();


	return 0;
}

생성자를 모른다면 public으로 바꿔서 int main에서 변수들에 대한 값을 하나하나 대입을 해줘야 합니다. 이럴 경우 번거로운 점이 있습니다. 

Fraction frac{ 0, 1 };

이런식으로  uniform initialization을 해줄 수도 있겠죠.

 

#include <iostream>
using namespace std;

class Fraction
{
public:
	int m_numerator = 0;
	int m_denominator = 1;
	
public:
	void print()
	{
		cout << m_numerator << " / " << m_denominator << endl;
	}
};

int main()
{
	Fraction frac;
	frac.print();


	return 0;
}

이렇게 기본값을 넣어버릴 수도 있을 것입니다. 하지만 내가 만드는 fraction은 1/0 을 기본으로 하면 좋겠다고 하면 또 다시 수정을 하기에는 번거롭습니다. 이럴 때는 생성자를 만들면 됩니다. 

 

public:
	Fraction()
	{
		m_numerator = 0;
		m_denominator = 1;
	}

이런 경우 반환 데이터타입이 없고 클래스 이름과 동일하면 이것을 생성자라고 합니다. 이것은 코딩을 하면서 의도적으로 호출을 하는 것이 아닙니다. frac.Fraction() 이렇게 하는 것이 아닙니다. 외부에서 호출할려고 쓰는 것이 아닌 Fraction frac;가 선언이 됨과 동시에 실행이 됩니다. 

 

생성자는 자동적으로 실행이 됩니다. 여기서 C++의 단점 중 하나는 Fraction frac; 이렇게 하는 것인데요. 생성자의 파라미터가 없으면 frac() 에서 괄호를 빼주셔야 합니다. 

 

기본적으로 생성자가 없어도 기본적인 fraction()이 숨겨져 있습니다. 생성자가 하나도 없을 때는 default 생성자를 만들어서 알아서 넣어줍니다. 즉 생성자를 하나라도 만들면 기본생성자가 생성이 안됩니다. 

 

#include <iostream>
using namespace std;

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

class First
{
	Second sec;

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

int main()
{
	First firaa;
	return 0;
}

 

반응형