[oop] 클래스에서 생성자를 비공개로 만드는 것은 무엇입니까?

클래스에서 생성자를 비공개로 만들어야하는 이유는 무엇입니까? 우리는 항상 생성자가 공개되어야합니다.



답변

개인 생성자가 필요한 몇 가지 이유는 다음과 같습니다.

  1. 생성자는 클래스 자체의 정적 팩토리 메소드 에서만 액세스 할 수 있습니다 . 싱글 톤도이 카테고리에 속할 수 있습니다.
  2. 정적 메소드 만 포함 하는 유틸리티 클래스

답변

개인 생성자를 제공하면이 클래스 이외의 다른 위치에서 클래스 인스턴스가 작성되지 않습니다. 이러한 생성자를 제공하기위한 몇 가지 사용 사례가 있습니다.

A. 클래스 인스턴스는 static메소드 에서 작성됩니다 . static그런 다음 이 메소드는로 선언됩니다 public.

class MyClass()
{
private:
  MyClass() { }

public:
  static MyClass * CreateInstance() { return new MyClass(); }
};

B. 수업은 싱글 톤 입니다. 이것은 프로그램에 클래스의 인스턴스가 두 개 이상 존재하지 않음을 의미합니다.

class MyClass()
{
private:
  MyClass() { }

public:
  MyClass & Instance()
  {
    static MyClass * aGlobalInst = new MyClass();
    return *aGlobalInst;
  }
};

C. (다가오는 C ++ 0x 표준에만 적용됨) 여러 생성자가 있습니다. 그들 중 일부는 선언 public되고 다른 것들은 선언 됩니다 private. 코드 크기를 줄이기 위해 공개 생성자는 모든 작업을 수행하는 개인 생성자를 ‘호출’합니다. 귀하의 public생성자 따라서이라고 위임 생성자를 :

class MyClass
{
public:
  MyClass() : MyClass(2010, 1, 1) { }

private:
  MyClass(int theYear, int theMonth, int theDay) { /* do real work */ }
};

D. 개체 복사를 제한하려고합니다 (예 : 공유 리소스 사용으로 인해).

class MyClass
{
  SharedResource * myResource;

private:
  MyClass(const MyClass & theOriginal) { }
};

E. 수업은 유틸리티 수업 입니다. 즉, static회원 만 포함한다는 의미 입니다. 이 경우 프로그램에서 개체 인스턴스를 만들면 안됩니다.


답변

다른 친구 클래스 / 함수가 사용자에게 금지 된 방식으로 객체를 구성 할 수있게하는 “후문”을 떠나는 것. 염두에 두는 예는 반복자를 구성하는 컨테이너 (C ++)입니다.

Iterator Container::begin() { return Iterator(this->beginPtr_); }
// Iterator(pointer_type p) constructor is private,
//     and Container is a friend of Iterator.


답변

모두 싱글 톤에 갇혀있어

다른 것들:

  • 사람들이 스택에서 수업을 만들지 못하게합니다. 전용 생성자를 만들고 팩토리 메소드를 통해 포인터를 넘겨줍니다.
  • 클래스 사본 작성 금지 (개인 사본 생성자)

답변

이것은 공통 코드를 포함하는 생성자에게 매우 유용 할 수 있습니다. 개인 생성자는 ‘this (…);’를 사용하여 다른 생성자가 호출 할 수 있습니다. 표기법. 개인 (또는 보호 된) 생성자에서 공통 초기화 코드를 만들면 코드가 생성 중에 만 호출된다는 것을 분명히 알 수 있습니다.

public class Point {
   public Point() {
     this(0,0); // call common constructor
   }
   private Point(int x,int y) {
     m_x = x; m_y = y;
   }
};


답변

공개 생성자를 사용하고 싶지 않은 경우가 있습니다. 예를 들어 싱글 톤 클래스를 원한다면

타사에서 사용하는 어셈블리를 작성하는 경우 어셈블리에 의해서만 생성되고 어셈블리 사용자가 인스턴스화하지 않는 많은 내부 클래스가있을 수 있습니다.


답변

이를 통해 사용자 (개인 생성자가있는 클래스)가 생성자 호출 방식을 제어 할 수 있습니다.

예제 : 팩토리 메소드가 객체를 할당하기로 선택한 경우 (예 : 싱글 톤 팩토리와 같이) 클래스의 정적 팩토리 메소드가 객체를 반환 할 수 있습니다.