[C++] 클래스 생성자와 소멸자
728x90
생성자
생성자는 클래스가 생성될 때 자동으로 실행되는 함수이다.
클래스에 생성자가 하나도 없는 경우 자동으로 디폴트 생성자를 하나 만들어준다.
생성자는 오버로딩이 가능하여 여러가지 생성자를 만들 수 있다.
생성자는 반환값을 가지지 않는다.
함수의 이름은 항상 자신의 클래스명과 동일하다.
class Car
{
public:
int Price;
Car();
Car(int value);
};
Car::Car()
{
Price = 1000;
}
Car::Car(int value)
{
Price = value;
}
int main()
{
Car myCar;
Car yourCar(10);
std::cout << "내 차 가격 : " << myCar.Price << std::endl;
std::cout << "너의 차 가격 : " << yourCar.Price << std::endl;
}
클래스는 자신을 호출할 때 this를 사용할 수 있으므로 매개변수 이름과 자신의 멤버변수 이름이 같은 경우 this를 이용하여 구분해준다.
class Car
{
public:
int Price;
Car();
Car(int Price);
};
Car::Car()
{
Price = 1000;
}
Car::Car(int Price)
{
this->Price = Price;
}
포인터로 선언 시 객체화 된 것이 아니기 때문에 생성자가 호출되지 않는다.
실제 메모리가 잡혔을 때 생성자가 호출된다.
class Car
{
public:
int Price;
Car();
};
Car::Car()
{
Price = 1000;
std::cout << "내 차 가격 : " << Price << std::endl;
}
int main()
{
Car myCar;
Car* pCar;
Car* pMyCar = new Car();
delete pMyCar;
}
위 코드에서 Car* pCar는 생성자가 호출되지 않아 아래 사진처럼 2번의 생성자만 호출된다.
소멸자
소멸자는 생성자와 반대로 메모리가 해제될 때 자동으로 호출된다.
소멸자는 ~를 사용하여 함수를 생성하며 오버로딩이 불가능하다.
생성자와 마찬가지로 반환값을 가지지 않는다.
class Car
{
public:
int Price;
Car();
~Car();
};
Car::Car()
{
Price = 1000;
std::cout << "생성자 호출" << std::endl;
}
Car::~Car()
{
std::cout << "소멸자 호출" << std::endl;
}
int main()
{
// 생성자 호출
Car myCar;
Car* pMyCar = new Car();
// 소멸자 호출
delete pMyCar;
}
위 코드 중 delete 를 한 번 밖에 하지 않았지만 소멸자는 2번이 호출되었다.
이는 Car myCar는 포인터가 아니지만 함수가 종료될 때 내부에 있는 지역변수들이 모두 해제되기 때문이다.
728x90
'[프로그래밍 공부] > C&C++' 카테고리의 다른 글
[C] while문 안에서 scanf 받기 (0) | 2022.01.13 |
---|---|
[C++] 가상 함수 (Virtual Function) (0) | 2022.01.08 |
[C++] 스마트 포인터 (0) | 2022.01.08 |
[C++] 클래스 상속(inheritance) (0) | 2022.01.01 |
[C++] 오버로딩과 오버라이딩 차이 (0) | 2022.01.01 |