728x90

클래스 객체가 생성될 때 호출되는 특별한 함수, 객체가 생성될 때 자동으로 호출되며 여러개를 만들 수 있다.

class TestConstructor
{
public:
	TestConstructor()
	{
		cout << "생성자 호출" << endl;
	}
};

기본 생성자

아무 인자도 받지 않는 생성자를 말한다. 명시적 기본 생성자와 암시적 기본 생성자가 있는데 어떠한 생성자도 만들어 주지 않으면 컴파일러가 기본 생성자를 만들어주는데 이것을 암시적 기본 생성자라고 하고, 그 외에 프로그래머가 만든 기본 생성자를 명시적 기본 생성자라고 한다. 또한 주의할 점은 기본 생성자 외에 다른 생성자를 명시적으로 만들경우 무조건 기본 생성자도 존재해야한다. 따라서 다른 생성자를 만들었는데 컴파일 에러가 난다면 기본 생성자가 있는지 꼭 확인을 해야한다.

복사 생성자

객체와 같은 클래스의 참조 값을 인자로 하는 생성자를 말한다. 기본 생성자와 마찬가지로 복사 생성자도 암시적 복사 생성자가 존재하는데 암시적 복사 생성자가 호출될 경우 '얕은 복사'가 일어나기 때문에 포인터나 참조 값을 멤버 변수로 들고 있다면 주의 해야 한다.

class TestConstructor
{
public:
	TestConstructor()
	{
		cout << "기본 생성자 호출" << endl;
	}

	// 복사 생성자 (대부분 멤버 변수의 값을 그대로 복사한 객체를 기대한다.)
	TestConstructor(const TestConstructor& other)
	{
    		_number = other._number;
		this->_number = other._number;
	}

public:
	int _number;
};

기타 생성자

기본 생성자와 복사 생성자 외에 즉, 인자를 받는데 자신과 똑같은 클래스가 아닌 다른 타입을 받는 생성자를 말한다.

class TestConstructor
{
public:
	TestConstructor()
	{
		cout << "기본 생성자 호출" << endl;
	}

	// 기타 생성자
	TestConstructor(int number, int number2)
	{
		// _number = number;
		this->_number = number;
		_number2 = number2;
	}

public:
	int _number;
	int _number2;
};

복사 생성자와 기타 생성자에서 this (자기 자신에 대한 포인터)를 사용하여 값을 지정해 주었지만, 자기 자신의 멤버에게 접근할 때는 this를 제거하고 주석문처럼 생략해서 사용이 가능하다.

타입 변환 생성자

기타 생성자 중에서 인자를 1개만 받는 기타 생성자를 타입 변환 생성자라고 한다.

 

class TestConstructor
{
public:
	TestConstructor()
	{
		cout << "기본 생성자 호출" << endl;
	}

	TestConstructor(const TestConstructor& other)
	{
		cout << "복사 생성자" << endl;
	}

	// 타입 변환 생성자
	TestConstructor(int number)
	{
		_number = number;
	}

public:
	int _number;
};

int main()
{
	TestConstructor t1 = 1;
	TestConstructor t2(1);
	TestConstructor t3;
	t3 = 1;

	return 0;
}

이 코드를 실행하면 에러가 날 것 같지만 실제로는 타입 변환 생성자가 실행 되면서 통과되는 것을 볼 수 있다. 컴파일러가 암시적으로 형변환 을 해주어 통과가 되는 것인데 이것을 방지 하려면 앞에 explicit키워드를 붙여주면 암시적인 형 변환을 막아 발생할 수 있는 에러를 막을 수 있다.

class TestConstructor
{
public:
	TestConstructor()
	{
		cout << "기본 생성자 호출" << endl;
	}

	TestConstructor(const TestConstructor& other)
	{
		cout << "복사 생성자" << endl;
	}

	// 타입 변환 생성자
	explicit TestConstructor(int number)
	{
		_number = number;
	}

public:
	int _number;
};

 

728x90

'C++ > C++ 기본' 카테고리의 다른 글

템플릿 기초  (0) 2023.05.12
함수 포인터  (0) 2023.05.12
캐스팅  (0) 2023.05.12
얕은 복사와 깊은 복사  (0) 2023.05.12

+ Recent posts