본문 바로가기

[C++] 클래스 생성자와 소멸자

Kwonriver 2022. 1. 1.
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번의 생성자만 호출된다.

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