관리자 글쓰기
C++ 생성자와 정적 멤버2
2022. 5. 12. 21:33 - pingu-s

생성자의 응용

 

(1) 객체의 배열 생성

 

생성자를 정의한 클래스에 관해 여러 가지 코드를 기술해 보도록 한다. 우선 처음에 객체의 배열을 생성하는 코드를 기술해 보는 것으로 한다. 클래스는 새로운 형의 하나이므로 배열을 선언할 수도 있다. 배열을 선언하면 객체를 종합해 취급할 수 있게 된다. 다음의 코드를 작성해 보도록 한다.

 

예제 13-3) 객체의 배열 생성

클래스에 대한 객체의 배열을 생성하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//House 클래스의 선언
class House{
private:
	const char* address;
	int space;
	const char* telephone;
public:
	House();
	House(const char* a, int s, const char* t);
	void show();
};

House::House() //인수가 없는 생성자를 정의한다.
{
	address = "";
	space = 0;
	telephone = "";
	cout << "하나의 집을 생성했습니다.\n";
}

House::House(const char* a, int s, const char* t) //인수를 3개 가지고 있는 생성자를 정의한다.
{
	address = a;
	space = s;
	telephone = t;
	cout << "주소는 " << address << ", 평수는 " << space << "이고, 전화번호는 "
		<< telephone << "인 집을 생성했습니다.\n";
}

void House::show()
{
	cout << "집의 주소는 " << address << "입니다.\n";
	cout << "집의 평수는 " << space << "평입니다.\n";
	cout << "집의 전화번호는 " << telephone << "입니다.\n";
}

int main()
{
	House house[3] = { House(), //인수가 없는 생성자를 호출한다.
	House("부산시 남구 대연3동", 64, "051-629-1004"), //
	House("서울시 중구 삼봉로", 25, "02-100-3000") //인수를 3개 가지고 있는 생성자를 2번 호출한다.
	};

	return 0;
}

이 코드에서는 객체의 배열을 선언하기 위해 { } 내에 컴마(,)로 구분한 초기화 값을 기술하고 있다. { }를 이용한 초기화는 배열 파트에서 설명했다. 이 코드에서는 첫 번째의 객체는 인수가 없는 생성자로 초기화하고 있다. 두 번째, 세 번째의 객체는 인수가 3개인 생성자로 초기화하고 있다.

 

많은 요소를 가지는 배열의 경우에는 초기화의 기술이 귀찮다. 그래서 초기화 값을 기술하지 않는 경우의 코드를 살펴보도록 한다.

 

예제 13-4) 초기화 값이 없는 객체 배열

예제 13-3을 이용하여 초기화 값이 없는 객체 배열을 생성하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//House 클래스의 선언
class House{
private:
	const char* address;
	int space;
	const char* telephone;
public:
	House();
	House(const char* a, int s, const char* t);
	void show();
};

House::House() //...①
{
	address = "";
	space = 0;
	telephone = "";
	cout << "하나의 집을 생성했습니다.\n";
}

House::House(const char* a, int s, const char* t)
{
	address = a;
	space = s;
	telephone = t;
	cout << "주소는 " << address << ", 평수는 " << space << "이고, 전화번호는 "
		<< telephone << "인 집을 생성했습니다.\n";
}

void House::show()
{
	cout << "집의 주소는 " << address << "입니다.\n";
	cout << "집의 평수는 " << space << "평입니다.\n";
	cout << "집의 전화번호는 " << telephone << "입니다.\n";
}

int main()
{
	House house[3]; //...②

	return 0;
}

① 초기화자 없이 배열을 생성하려면 인수가 없는 생성자가 필요하다.

② 인수가 없는 생성자가 호출된다. 객체의 배열은 초기화자 없이 기술할 수도 있다. 단, 이때에는 반드시 인수가 없는 생성자가 호출되는 것으로 된다. 이 때문에 만약 인수가 한 개 이상인 생성자를 정의한 경우에는 반드시 인수가 없는 생성자도 모두 정의해야 한다. 생성자를 한 개라도 자기 자신이 정의한 경우에는 디폴트 생성자가 준비되어 있지 않기 때문이다.

 

함수 파트에서 학습한 디폴트 인수를 사용하면 생성자를 더 간단하게 기술할 수 있는 경우도 있다. 다음의 예를 살펴보도록 한다.

 

예제 13-5) 디폴트 인수를 가지는 생성자

디폴트 인수를 이용한 생성자 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//House 클래스의 선언
class House {
private:
	const char* address;
	int space;
	const char* telephone;
public:
	House(const char* a = "0", int s = 0, const char* t = "0"); //디폴트 인수를 지정하는 생성자이다.
	void show();
};

House::House(const char* a, int s, const char* t) //인수를 3개 가지고 있는 형이다.
//이 코드에서는 인수를 3개 가지는 생성자를 1개만 정의하고 있다.
{
	address = a;
	space = s;
	telephone = t;
	cout << "주소는 " << address << ", 평수는 " << space << "이고, 전화번호는 "
		<< telephone << "인 집을 생성했습니다.\n";
}

void House::show()
{
	cout << "집의 주소는 " << address << "입니다.\n";
	cout << "집의 평수는 " << space << "평입니다.\n";
	cout << "집의 전화번호는 " << telephone << "입니다.\n";
}

int main()
{
	House first_house; //인수를 전달하지 않는 객체를 생성한다.
	House second_house("부산시 남구 대연", 64, "629-1004"); //3개의 인수를 전달해서 객체를 생성한다.
	House third_house("서울시 중구 세종", 45); //2개의 인수를 전달해서 객체를 생성한다.
	House fourth_house("전남 남구 중부"); //1개의 인수를 전달해서 객체를 생성한다.

	return 0;
}

디폴트 인수를 가지는 생성자를 사용할 경우 인수를 전달하지 않고 호출하는 경우도, 전달하고 호출하는 경우도 가능하다. 디폴트 인수를 사용함으로써 여러 개의 생성자를 1개로 묶어 간단하게 코드를 기술하고 있는 것이다.

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

배열, 리스트, 벡터  (1) 2024.04.30
C++ 생성자와 정적 멤버3  (0) 2022.05.16
C++ 생성자와 정적 멤버  (0) 2022.05.12
C++ 클래스와 객체3  (0) 2022.05.12
C++ 클래스와 객체2  (0) 2022.05.11