Effective C++ (개인 공부)

디폴트 생성자, 소멸자 및 대입연산자 C++

TIN9 2022. 11. 5.
반응형
해당 게시글은 Effecitve C++ 참고하며 개인 공부목적으로 적은 글입니다.

Effecitve C++ 80P

 

디폴트 생성자(default constructor)

디폴트 생성자란 객체가 생성될 때 사용자가 초기값을 직접 작성하지 않으면 컴파일러가 자동으로 만드는 생성자이다.

 

소멸자, 대입연산자도 마찬가지로 직접 초기값을 설정하지 않는다면 컴파일러가 자동으로 만들어준다.

 

원형

Class::Class() {}

디폴트 생성자 선언

class TestClass
{
};

int main()
{
	TestClass Test;	// 암시적 호출
	TestClass Test = TestClass(); // 명시적 호출

	return 0;
}

디폴트 생성자, 소멸자, 복사생성자 및 대입연산자

비어있는 클래스를 만든다고 하더라도 말 그대로 비어있는게 아니라

컴파일러가 자동적으로 디폴트함수들을 생성해주게 된다.

class TestClass
{
	TestClass() {}	// 디폴트 생성자
    TestClass(const TestClass& Ref) {}	// 디폴트 복사 생성자
    ~TestClass() {}	// 디폴트 소멸자
    
    TestClass& operator = (const TestClass& Ref) {} // 디폴트 복사 대입 연산자
};

이들이 만들어지는 조건

TestClass T1;	// 디폴트 생성자

TestClass T2(T2);	// 디폴트 복사 생성자

T2 = T1;	// 디폴트 복사 대입 연산자

문제가 되는 복사 대입 연산자 사용

#include "Widget.h"

#include <string>

template<class T>
class NameObject
{
public:
	NameObject(std::string& Name, const T& Value)
	{
	}

private:
	std::string& NameValue;
	const T ObjectValue;
};


int main()
{
	std::string NewDog("Persephone");
	std::string OldDog("Satch");

	NameObject<int> P(NewDog, 2);

	NameObject<int> S(OldDog, 36);


	// 레퍼런스의 특성상 P.NameValue의 기존 string참조자 이외의 다른 객체를 참조 할 수 없다.
	// 상수 특성상 대입연산이 안되어 변경 불가함.
	//P = S;

	return 0;
}

주석에 달아놓은 내용처럼 레퍼런스의 특성상 P.NameValue의 기존 string참조자 이외의 다른 객체를 참조 할 수 없고
상수 특성상 대입연산이 안되어 변경 불가한것을 주의해야 한다.

 

디폴트 함수가 필요없다면 금지하기

class Test
{
public:
	Test() {}
	~Test() {}

private:
	Test(const Test&) {}

	Test& operator = (const Test&) {}
};

디폴트 함수가 필요없다면 private을 이용해서 접근하지 못하도록 막아준다.

반응형

'Effective C++ (개인 공부)' 카테고리의 다른 글

객체 초기화  (0) 2022.11.04

댓글