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 {
...
};
복사를 외부에서 시도할때 컴파일러는 자동으로 생성하려 하는데 접근이 불가능하므로
기능을 허용치않는 효과를 얻을 수 있다.
이와 같이 상속을 통해 여러 클래스를 막을 수도 있지만 비슷한 기본 클래스를 만들어두는 것도
좋을 것 같다. 다중 상속 문제가 생길 수도 있기 때문이다.
'STUDY > C++' 카테고리의 다른 글
C++ - 가변 인자 템플릿 (Variadic Template) (0) | 2022.03.21 |
---|---|
C++ - 캐스팅(형변환), static_cast, dynamic_cast, const_cast,reinterpret_cast (0) | 2022.03.18 |
C++ - Template 템플릿, 동작과정, typename과 class 선언의 차이 (0) | 2022.03.16 |
C++ std::function / std::bind / std::placeholders 사용법 (0) | 2022.01.21 |
숫자0~9까지 아스키코드값은 48~57 영문a~z까지의 아스키코드값은대문자 65~90소문자 97~122 (0) | 2021.11.01 |