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
'[C,C++]' 카테고리의 다른 글
[C,C++ 개념정리] Member initializer list (0) | 2020.04.08 |
---|---|
[C,C++ 개념정리] encapsulation, access specifiers & functions (0) | 2020.04.05 |
[C,C++ 개념정리] 객체지향의 시작 (2) | 2020.04.02 |
[C,C++ 개념정리] Ellipsis, 생략부호 (0) | 2020.03.27 |