STUDY/C++
C++ - 자동으로 컴파일러가 만들어주는 복사생성자, 복사 대입 연산자 사용 방지법
최디디
2022. 7. 28. 14:44
Effective C++ 책을 보고 정리한 글입니다.
클래스가 비어있다고 해도 클래스 안에 직접 선언을 안 해도
자동으로 컴파일러가 생성하는 함수는 생성자, 복사 생성자, 복사 대입 연산자, 소멸자 등 이 있다.
모두 public의 접근제어자를 가지며 inline함수이다.
자동으로 만들어지는 클래스의 함수들
class Test{}; // 이렇게 빈 클래스를 만들면
// 아래 함수가 자동으로 생성됨
class Test{
public:
Test(){}; //기본 생성자
Test(const Test& rhs){}; //복사 생성자
~Test(){};//소멸자
Test& operator=(const Test& rhs){};//복사 대입 연산자
};
컴파일러가 자동으로 만들어주는 함수가 필요가 없다면
사용을 못하게 막아둘 필요가 있다.
하지만 위에서 말했듯이 public 접근제어를 갖는다.
private으로 선언한다해도 friend 함수가 호출할 수 있다는 문제점이 있다.
friend : private 멤버 변수를 접근 가능하게 하는 키워드
멤버 함수를 private으로 선언하고 정의하지 않는 방법을 사용하면 된다.
c++ iostream 라이브러리에서도 복사 방지책으로 사용한다고 한다.
class UncopyUtil{
protected: //상속된 것만 접근 가능
UncopyUtil(){};
~UncopyUtil(){};
private:
UncopyUtil(const UncopyUtil& rhs); //복사생성, 복사대입 방지
UncopyUtil& operator=(const UncopyUtil& rhs);
};
class Test : private UncopyUtil {
...
};
복사를 외부에서 시도할때 컴파일러는 자동으로 생성하려 하는데 접근이 불가능하므로
기능을 허용치않는 효과를 얻을 수 있다.
이와 같이 상속을 통해 여러 클래스를 막을 수도 있지만 비슷한 기본 클래스를 만들어두는 것도
좋을 것 같다. 다중 상속 문제가 생길 수도 있기 때문이다.