생성자 예제
#include <iostream>
using namespace std;
class SimpleClass
{
private:
int num1;
int num2;
public:
// 기본 생성자: num1과 num2를 0으로 초기화
SimpleClass()
{
num1 = 0;
num2 = 0;
}
// 하나의 매개변수를 받는 생성자: num1을 주어진 값으로 설정하고, num2는 0으로 초기화
SimpleClass(int n)
{
num1 = n;
num2 = 0;
}
// 두 개의 매개변수를 받는 생성자: num1과 num2를 각각 주어진 값으로 설정
SimpleClass(int n1, int n2)
{
num1 = n1;
num2 = n2;
}
// num1과 num2의 값을 출력하는 함수
void ShowData() const
{
cout << num1 << " " << num2 << endl;
}
};
int main(void)
{
// 기본 생성자를 사용하여 객체 생성
SimpleClass sc1;
sc1.ShowData(); // num1 = 0, num2 = 0 출력
// 하나의 매개변수를 받는 생성자를 사용하여 객체 생성
SimpleClass sc2(100);
sc2.ShowData(); // num1 = 100, num2 = 0 출력
// 두 개의 매개변수를 받는 생성자를 사용하여 객체 생성
SimpleClass sc3(100, 200);
sc3.ShowData(); // num1 = 100, num2 = 200 출력
return 0;
}
<출력문>
0 0
100 0
100 200
- 기본 생성자: 매개변수가 없을 때 num1과 num2를 0으로 초기화합니다.
- 하나의 매개변수를 받는 생성자: num1에 주어진 값을 설정하고 num2는 0으로 설정합니다.
- 두 개의 매개변수를 받는 생성자: num1과 num2에 각각 주어진 값을 설정합니다.
- ShowData 함수는 num1과 num2의 값을 출력하는 역할을 합니다.
- main 함수에서는 각각 다른 생성자를 이용해 객체를 생성한 후, 각 객체의 num1과 num2 값을 출력합니다.
- 이 예문을 통해 생산자를 오버로딩이 가능하다는 사실을 확인 할수 있습니다.
디폴트 생성자
디폴트 생성자의 특징
- 암시적 생성: 사용자가 클래스에 어떤 생성자도 정의하지 않으면 컴파일러가 자동으로 디폴트 생성자를 생성합니다.
- 기본 초기화: 컴파일러가 생성한 디폴트 생성자는 멤버 변수를 기본값으로 초기화합니다. (예: 숫자 타입은 0, 포인터는 nullptr)
- 명시적 정의: 사용자가 직접 디폴트 생성자를 정의할 수도 있습니다. 이 경우 멤버 변수를 원하는 값으로 초기화하거나 추가적인 작업을 수행할 수 있습니다.
#include <iostream>
class MyClass
{
public:
int value;
// 명시적으로 정의한 디폴트 생성자
MyClass() : value(10)
{
std::cout << "디폴트 생성자 호출!" << std::endl;
}
};
int main()
{
MyClass obj; // 디폴트 생성자 호출
std::cout << obj.value << std::endl; // 출력: 10
return 0;
}
디폴트 생성자를 사용하는 이유
- 간편한 객체 생성: 객체를 생성할 때 매번 인자를 전달할 필요 없이 간편하게 객체를 생성할 수 있습니다.
- 일관성 유지: 멤버 변수를 특정 값으로 초기화하여 객체의 상태를 일관되게 유지할 수 있습니다.
- 유연성 확보: 디폴트 생성자를 제공함으로써 객체를 생성하는 다양한 방법을 제공할 수 있습니다.
#include <iostream>
using namespace std;
class AAA
{
private:
int num;
public:
// 기본 생성자: num을 0으로 초기화
AAA() : num(0) {}
// 객체를 생성하고 초기화한 후 참조를 반환하는 함수
AAA& CreateInitObj(int n) const
{
AAA* ptr = new AAA(n); // 동적으로 n을 매개변수로 객체 생성
return *ptr; // 생성한 객체의 참조를 반환
}
// num 값을 출력하는 함수
void ShowNum() const
{
cout << num << endl;
}
private:
// 매개변수 n을 받아 num을 초기화하는 private 생성자
AAA(int n) : num(n) {}
};
int main(void)
{
// 기본 생성자를 사용하여 객체 생성
AAA base;
base.ShowNum(); // num = 0 출력
// CreateInitObj 함수를 사용하여 새로운 객체 생성 및 초기화
AAA& obj1 = base.CreateInitObj(3);
obj1.ShowNum(); // num = 3 출력
AAA& obj2 = base.CreateInitObj(12);
obj2.ShowNum(); // num = 12 출력
// 동적으로 생성된 객체들은 delete로 메모리 해제 필요
delete &obj1;
delete &obj2;
return 0;
}
<출력문>
0
3
12
클래스에서의 객체 배열
#include <iostream>
#include <cstring>
using namespace std;
class Person
{
private:
char *name;
int age;
public:
// 생성자: 이름과 나이를 초기화
Person(char *myname, int myage)
{
int len = strlen(myname) + 1;
name = new char[len];
strcpy(name, myname);
age = myage;
}
// 기본 생성자
Person()
{
name = NULL;
age = 0;
cout << "called Person()" << endl;
}
// Person 정보 설정
void SetPersonInfo(char *myname, int myage)
{
name = myname;
age = myage;
}
// Person 정보 출력
void ShowPersonInfo() const
{
cout << "이름: " << name << ", ";
cout << "나이: " << age << endl;
}
// 소멸자: 동적 할당 메모리 해제
~Person()
{
delete[] name;
cout << "called destructor!" << endl;
}
};
int main(void)
{
// Person 객체 배열 선언
Person parr[3];
char namestr[100];
char *strptr;
int age;
int len;
// 사용자로부터 이름과 나이 입력을 받아 Person 객체 초기화
for (int i = 0; i < 3; i++)
{
cout << "이름: ";
cin >> namestr;
cout << "나이: ";
cin >> age;
len = strlen(namestr) + 1;
strptr = new char[len];
strcpy(strptr, namestr);
parr[i].SetPersonInfo(strptr, age);
}
// Person 객체 정보 출력
parr[0].ShowPersonInfo();
parr[1].ShowPersonInfo();
parr[2].ShowPersonInfo();
return 0;
}
<출력문>
called Person()
called Person()
called Person()
이름: 곽성민
나이: 20
이름: 김수현
나이: 21
이름: 임민호
나이: 20
이름: 곽성민, 나이: 20
이름: 김수현, 나이: 21
이름: 임민호, 나이: 20
called destructor!
called destructor!
called destructor!
객체 포인터 배열
#include <iostream>
#include <cstring>
using namespace std;
class Person
{
private:
char *name;
int age;
public:
// 생성자: 이름과 나이를 초기화
Person(char *myname, int myage)
{
int len = strlen(myname) + 1;
name = new char[len];
strcpy(name, myname);
age = myage;
}
// 기본 생성자
Person()
{
name = NULL;
age = 0;
cout << "called Person()" << endl;
}
// Person 정보 설정
void SetPersonInfo(char *myname, int myage)
{
name = myname;
age = myage;
}
// Person 정보 출력
void ShowPersonInfo() const
{
cout << "이름: " << name << ", ";
cout << "나이: " << age << endl;
}
// 소멸자: 동적 할당 메모리 해제
~Person()
{
delete[] name;
cout << "called destructor!" << endl;
}
};
int main(void)
{
Person* parr{3];
char namestr[100]'
int age;
for(int i=0; i<3; i++)
{
cout<<"이름 : ";
cin>>namestr;
cout<<"나이 : ";
cin>>age;
parr[i]=new Person(namestr, age);
}
parr[0]->ShowPersonInfo();
parr[1]->ShowPersonInfo();
parr[2]->ShowPersonInfo();
delete parr[0];
delete parr[1];
delete parr[2];
return 0;
}
<출력문>
called Person()
called Person()
called Person()
이름: 곽성민
나이: 20
이름: 김수현
나이: 21
이름: 임민호
나이: 20
이름: 곽성민, 나이: 20
이름: 김수현, 나이: 21
이름: 임민호, 나이: 20
called destructor!
called destructor!
called destructor!
'C++' 카테고리의 다른 글
this 포인터의 이해 (0) | 2024.09.26 |
---|---|
' : '과 ' :: '의 차이점 (0) | 2024.09.26 |
c++ 참조 (0) | 2024.09.25 |
c++ 클래스 (3) | 2024.09.25 |
vector와 array (0) | 2024.09.25 |
댓글