07
28

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 {
...
};

 

복사를 외부에서 시도할때 컴파일러는 자동으로 생성하려 하는데 접근이 불가능하므로

기능을 허용치않는 효과를 얻을 수 있다. 

이와 같이 상속을 통해 여러 클래스를 막을 수도 있지만 비슷한 기본 클래스를 만들어두는 것도 

좋을 것 같다. 다중 상속 문제가 생길 수도 있기 때문이다.

COMMENT