본문 바로가기

C++/C++ 문법

[C++] 생성자와 소멸자, 생성자의 오버로딩, 디폴트 생성자, 객체의 동적할당

728x90
반응형

생성자

 

C++에서도 C#에서와 마찬가지로 생성자를 선언할 수 있다.

 

C# 문법을 포스팅할 때 이미 한 번 설명했지만

다시 설명하자만 생성자란 클래스와 이름이 같은 멤버함수로 객체 생성 시 최초 1회만 호출된다.

 

이 함수는 반환형이 선언되어 있지 않으며 실제로 아무것도 반환하지 않는다.

 

따라서 아래와 같이 생성자를 선언할 수 있다.

 

class TestClass {
private:
	int num = 10;
public:
	TestClass(int n) {
		num = n;
		cout << "num : " << num << endl;
	}
};

 

 

 

 

 



 

 

 

 

 

 

 

생성자의 오버로딩

 

생성자의 오버로딩 또한 가능하다.

 

class TestClass {
private:
	int num = 10;
public:
	TestClass(int n) {
		num = n;
		cout << "num : " << num << endl;
	}
	TestClass() {
		num = 9;
		cout << "매개변수 없음" << endl;
	}
};

 

 

 

 

 

 

이때 생성자에 매개변수를 전달하지 않으려면 괄호를 사용하지 않고 클래스를 선언해주면 된다.

 

따라서 생성자를 아래 코드와 같이 사용할 수 있다.

 

#include <iostream>
using namespace std;

class TestClass {
private:
	int num = 10;
public:
	void ShowNum() {
		cout << "ShowNum / num : " << num << endl;
	}

	TestClass(int n) {
		num = n;
		cout << "num : " << num << endl;
	}
	TestClass() {
		num = 9;
		cout << "매개변수 없음" << endl;
	}
};

int main()
{
	TestClass test1(5);
	TestClass test2;
	test1.ShowNum();
	test2.ShowNum();
	return 0;
}

 

 

 

test1은 생성자에 5의 매개변수를 전달하여 "num : 5"라는 콘솔메시지가 출력되었지만

test2는 생성자에 매개변수를 전달하지 않으면서 "매개변수 없음"이라는 메시지를 출력하게 된다.

 

 

 

 

 

 

 

 

 

소멸자

 

C#과 마찬가지로 소멸자를 정의하는 것도 가능하다.

 

선언하는 방법도 완전히 동일하다.

 

따라서 위 코드에 소멸자를 추가하여 아래 코드처럼 사용하는 것이 가능하다.

 

#include <iostream>
using namespace std;

class TestClass {
private:
	int num = 10;
public:
	void ShowNum() {
		cout << "ShowNum / num : " << num << endl;
	}

	TestClass(int n) {
		num = n;
		cout << "num : " << num << endl;
	}
	TestClass() {
		num = 9;
		cout << "매개변수 없음" << endl;
	}

	~TestClass() {
		cout << "생성자 소멸" << endl;
	}

};

int main()
{
	TestClass test1(5);
	TestClass test2;
	test1.ShowNum();
	test2.ShowNum();
	return 0;
}

 

 

 

 

 

 

C# 문법에서 생성자와 소멸은 아래 포스팅에서 확인할 수 있다.

 

https://enchupin.tistory.com/8

 

[C#] 생성자, 소멸자

생성자 C# 클래스에는 생성자라는 메서드가 존재한다. 이 생성자의 역할은 객체가 생성되는 순간에 메서드를 실행시킨다. 생성자를 정의하는 방법은 클래스 안에 접근제한자와 클래스명을 명시

enchupin.tistory.com

 

 

 

 

 

 

 

 

 

 

디폴트 생성자 (Default Constructor)

 

객체를 생성할 때에는 반드시 메모리 공간이 할당된 후 생성자의 호출까지 완료되어야 한다.

 

그런데 생성자를 따로 선언하지 않았다면 객체의 생성을 완료하기 위해 컴파일러가 디폴트 생성자를 생성한다.

 

디폴트 생성자는 인자를 요구하지 않으며 내부적으로 아무런 일도 하지 않는 코드이다.

 

 

 

따라서 다음과 같이 정의된 클래스는

class TestClass {
private:
	int num;
public:
	int GetNum() {
		return num;
	}
};

 

 

아래 코드와 완전히 동일하다.

class TestClass {
private:
	int num;
public:
	TestClass() { }
	int GetNum() {
		return num;
	}
};

 

 

따라서 모든 객체는 한 번의 생성자 호출을 동반하게 된다.

 

 

 

 

 

 

 

객체의 동적할당

 

위의 클래스를 new 연산자를 이용한 다음의 형태로 생성해도 객체의 생성과정에서 생성자는 호출된다.

TestClass* ptr = new test;

 

만약 생성자에 값을 전달해야한다면 다음과 같이 선언할 수 있다.

TestClass* ptr = new test(5);

 

그러나, 다음과 같이 C언어의 malloc 함수를 이용한다면 생성자는 호출되지 않는다.

TestClass* ptr = (TestClass*)malloc(sizeof(TestClass));

 

따라서 객체를 동적으로 할당하는 경우에는 반드시 new 연산자를 이용해야 한다.

 

 

 

 

 

 

728x90
반응형