티스토리 뷰

언어/C++

8.3 생성자 Constructors

js0331 2020. 4. 22. 19:45
#include<iostream>

using namespace std;

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

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

// -1105949216 / 32764

 

 

이문제를 해결하는 방법으로는

 

1. private -> public 으로 바꾼 후 main에서 값을 할당한다.

 

2. 직접 대입하는 방법

class Fraction
{
	private:
	int m_numerator = 0;
	int m_denominator = 1;
	

 

3. 생성자를 만들어서 이용하는 방법

#include<iostream>

using namespace std;

class Fraction
{
	private:
	int m_numerator;
	int m_denominator;
	
	public:
	// return 값이 없다는 것이 특징.
	// 선언이 됨과 동시에 실행됨. 
	Fraction()
	{
		m_numerator = 0;
		m_denominator = 1;
	}
	
	void print()
	{
		cout << m_numerator << " / " << m_denominator << endl;
	}
};

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

//	0 / 1

 

생성자도 함수인데 가로가 없는 이유는? 

생성자의 parameter가 하나도 없는 경우에는 가로를 생략해줌.

 

 

#include<iostream>

using namespace std;

class Fraction
{
	private:
	int m_numerator;
	int m_denominator;
	
	public:
	// return 값이 없다는 것이 특징.
	// 선언이 됨과 동시에 실행됨. 
	Fraction(const int& n_input, const int& d_input = 1)
	{
		m_numerator = n_input;
		m_denominator = d_input;
	}
	
	void print()
	{
		cout << m_numerator << " / " << m_denominator << endl;
	}
};

int main()
{
	Fraction one_thirds(1, 3);
	one_thirds.print();
}

// 1 / 3

 

생성자가 하나도 없는 경우는 클래스가 디폴트로 생성자를 넣어줌.

 

이름이 Constructor인 이유는 construction 될때 자동으로 호출되는 함수이기 때문이다.

 

 

int main()
{
	Fraction one_thirds;
	Fraction test{ 1, 3 };
	Fraction test( 1, 3 );
	
	one_thirds.print();
	test.print();

	return 0;
}

 

둘의 차이는?

 

1. uniform init의 경우 타입변환을 허용하지 않는다.

 

2. 괄호의 경우 경고만 주고 타입변환을 허용한다.

 

 

 

#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 fir;
	
	return 0;
}

// class Second constructor()
// class First constructor()

 

second가 first의 멤버로 초기화되어있기 때문에 second를 먼저 초기화하고나서 first의 초기화를 진행한다.

'언어 > C++' 카테고리의 다른 글

8.5 위임 생성자  (0) 2020.04.22
8.4 생성자 멤버 초기화 목록  (0) 2020.04.22
8.2 캡슐화, 접근 지정자, 접근 함수  (0) 2020.04.22
[C++] std::array  (0) 2020.03.28
[C++] 문자열 / std::string  (0) 2020.03.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함