c++에서 객체 생성시 사용자가 class에 정의하지 않았어도 기본적으로 만들어지는 함수들이 있다. 바로 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자이다.
class Test{
};
처럼 빈 클래스를 만들어도 컴파일러에 의해 아래처럼 코드가 생성 된다.
class Test{
private:
public:
Test(){}//기본 생성자
Test(const Test& copy){}//기본 복사 연산자
~Test(){}//기본 소멸자
Test& operator=(const Test& assign){
return *this;
}//기본 대입 연산자
};
그런데 이러한 컴파일러에 의해 생성되는 코드들은 가끔 불필요할때가 있다.
그래서 프로그램내에서 내가 설계한 클래스가 오직 하나만 생성되는 경우(싱글톤) 또는 객체가 절대 복사나 대입을 허용하고 싶지 않을때 사용하는 기법이 있다.
복사생성자, 복사대입자를 private 접근제한자에 선언(정의x)한 클래스를 하나 만들고 그 클래스를 private상속해서 사용 하면 된다. 정의를 하지 않았기 때문에 복사나 대입을 시도하게 된다면 빌드시 오류가 발생하게 된다.
Ex)
class Uncopyable{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
class Test:private Uncopyable{
private:
public:
Test(){}//기본 생성자
~Test(){}//기본 소멸자
};
'C and C++' 카테고리의 다른 글
[C++] 자원관리 Smart Pointer (shared_ptr) (0) | 2018.06.17 |
---|---|
[C++] 상속을 허용하는 Base 클래스의 소멸자는 반드시 가상(virtual) 소멸자로 선언 (0) | 2018.06.03 |
[C++] 객체를 초기화 할때는 생성자 초기화 리스트를Initialize List) 사용하기 (0) | 2018.05.13 |
[C++] #define은 지양하자 (0) | 2018.05.06 |
[C++] delete시 주의점 (0) | 2018.01.01 |