지금까지 멤버변수 초기화를 목적으로 InitMembers를 호출했는데 이를 쉽게 대체해주는 자식
생성자: 객체도 생성과 동시에 초기화 가능하게 함
class SimpleClass
{
private:
int num;
public:
SimpleClass(int n)
{
num = n;
}
int GetNum() const
{
return num;
}
};
- 클래스의 이름과 함수의 이름이 동일
- 반환형이 선언되어 있지 않으며, 실제로 반환하지 않음
- 객체 생성 시 딱 한번 호출됨
SimpleClass sc; //전역, 지역 및 매개변수의 형태
SimpleClass *ptr = new SimpleClass; //동적 할당의 형태
생성자가 정의되었으므로
SimpleClass sc(20); //생성자에 20을 전달
SimpleClass *ptr = new SimpleClass(30); // 생성자에 30을 전달
- 생성자도 함수의 일종이니 오버로딩 가능
- 생성자도 함수의 일종이니 매개변수에 디폴트값 설정 가능
SimpleClass sc1;
SimpleClass * ptr1 = new SimpleClass;
SimpleClass * ptr1 = new SImpleClass();
1.멤버 이니셜라이저(Member Initializer)
객체 생성 과정에서 그 안에 담긴 클래스의 생성자를 한번에 초기화하고 싶을 때 사용
class Rectangle
{
private:
Point upLeft;
Point lowRight;
public:
Rectangle(const int &x1, const int &y1, const int &x2, const int &y2);
void ShowRecInfo() const;
};
Rectangle::Rectangle(const int &x1, const int &y1, const int &x2, const int &y2)
:upLeft(x1, y1), lowRight(x2, y2)
{
//empty
}
:upLeft(x1, y1), lowRight(x2, y2)
객체 upLeft의 생성과정에서 x1과 y1을 인자로 전달받는 생성자를 호출하라
객체 lowRight의 생성과정에서 x2과 y2을 인자로 전달받는 생성자를 호출하라
멤버 이니셜라이저는 멤버변수로 선언된 객체의 생성자 호출에 활용됨.
(생성자의 몸체 부분이 그냥 비는 일이 종종 발생하니 이를 이상하게 여길 필요는 없다.)
생성자는 이니셜라이저처럼 선택적으로 존재하는 대상이 아님.
생성자는 반드시 호출됨 '디폴트 생성자'
2.멤버 이니셜라이저를 이용한 변수 및 const 상수(변수) 초기화
Class SoSimple
{
private:
int num1;
int num2;
public:
SoSimple(int n1, int n2): num1(n1)
{
num2 = n2;
}
. . . .
};
num1(n1)
멤버 이니셜라이저는 객체가 아닌 멤버의 초기화에도 사용할 수 있음
프로그래머는 생성자의 몸체에서 초기화하는 방법 / 이니셜라이저를 초기화하는 방법 중 선택 가능
이니셜라이저를 쓰면 장점: 초기화의 대상을 명확히 인식 가능 / 성능에 약간의 이점
const멤버변수도 이니셜라이저를 이용하면 초기화가 가능
#include <iostream>
using namespace std;
class FruitSeller
{
private:
const int APPLE_PRICE;
int numOfApples;
int myMoney;
public:
FruitSeller(int price, int num, int money)
:APPLE_PRICE(price), numOfApples(num), myMoney(money)
{
}
int SaleApples(int money)
{
//예제 FruitSaleSim2.cpp와 동일
}
void ShowSalesResult() const
{
//예제 FruitSaleSim2.cpp와 동일
}
};
class FruitBuyer
{
private:
int myMoney;
int numOfApples;
public:
FruitBuyer(int money)
:myMoney(money), numOfApples(0)
{
}
void BuyApples(FruitSeller &seller, int money)
{
//예제 FruitSaleSim2.cpp와 동일
}
void ShowBuyResult() const
{
//예제 FruitSaleSim2.cpp와 동일
}
}
int main(void)
{
//예제 FruitSaleSim2.cpp와 동일
}
3.디폴트 생성자
객체가 되기 위해서 반드시 하나의 생성자가 호출되어야 하며,
이러한 기준에 예외를 두지 않기 위해서 생성자를 정의하지 않는 클래스에는 C++컴파일러에 의해 자동 생성됨.
인자를 받지 않으며, 내부적으로 아무 일도 하지 않는 생성자
단, new연산자가 아닌 C언어 malloc함수를 이용하면 생성자는 호출되지 않는다.
4.소멸자의 이해와 활용
객체 생성시 반드시 호출되는 것이 생성자라면, 객체소멸시 반드시 호출되는 것은 소멸자.
~A(){. . .}
class AAA
{
//empty Class
};
class AAA
{
public:
AAA() {}
~AAA() {}
};
#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;
}
void ShowPersonInfo() const
{
cout << "이름: " << name <<endl;
cout << "나이: " << age <<endl;
}
~Person()
{
delete []name;
cout << "called destructor!" <<endl;
}
};
int main(void)
{
Person man1("Lee", 29);
Person man2("Jang", 41);
man1.ShowPersonInfo();
man2.ShowPersonInfo();
return 0;
}
'LANG > C++' 카테고리의 다른 글
[C++]05-1.'복사생성자'와의 첫 만남 (0) | 2023.05.13 |
---|---|
[C++]04-4.클래스와 배열 그리고 포인터 (0) | 2023.05.12 |
[C++]04-2.캡슐화(Encapsulation) (0) | 2023.05.12 |
[C++]04-1.정보은닉(Information Hiding) (2) | 2023.05.12 |
[C++]03-3.객체지향 프로그래밍의 이해 (0) | 2023.05.12 |