생성자
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
디폴트 생성자 (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 연산자를 이용해야 한다.
'C++ > C++ 문법' 카테고리의 다른 글
[C++] 객체 배열 (0) | 2024.04.29 |
---|---|
[C++] 멤버 이니셜라이저 (Member Initializer), const 멤버변수 초기화 (0) | 2024.03.31 |
[C++] 객체의 전달 (const&) (0) | 2024.03.21 |
[C++] 클래스, 접근제어지시자(public, private), const 함수 (0) | 2024.03.21 |
[C++] 구조체 (0) | 2024.03.10 |