반응형
#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;
}
반응형
'IT 프로그래밍 > C++' 카테고리의 다른 글
[따배시 C++ 8.6] 소멸자 destructor (0) | 2024.04.10 |
---|---|
[따배시 C++ 8.4] 생성자 멤버 초기화 목록, 위임 생성자 (0) | 2024.04.10 |
[C++ 따배시 8.1] 객체지향 프로그래밍과 클래스 (0) | 2024.04.07 |
[C++] 멤버함수 혹은 메서드 (0) | 2024.04.06 |
[C++]클래스와 객체 (0) | 2024.04.06 |