2013-08-08 2 views
5

나는 이와 같은 코드를 보았 기 때문에 그 이유를 찾으려고합니다.
실제 생성자가있는 대신 생성자로 작동하는 정적 함수가있는 주된 이유는 무엇입니까?클래스 구성을위한 정적 함수의 이점

class MyClass 
{ 
    public: 
    static MyClass CreateFrom(bar); 
    static MyClass CreateFrom(foo); 
    ... 
} 

대신 : 그들은 Named Constructors라고

class MyClass 
{ 
    public: 
    MyClass(bar); 
    MyClass(foo); 
    ... 
} 

답변

10

"명명 된 생성자 관용어"라고합니다.

때 그것은 일반적으로 사용되는 : 당신은 ctors가 혼동 될 과부하가 유사한만큼 충분한 매개 변수 목록과 ctors을 많이 가지고

  1. (예를 들어,, 정수와 부동 소수점 숫자의 서로 다른 조합이므로 1, 1.0, 11, 1, 1.0과 다른 것을 의미합니다.
  2. 입력 소스 유형이 동일한 두 가지 소스가 있습니다. 예를 들어, 지구 표면의 거리를 멀리 떨어진 점 사이의 각도로 변환하려고한다고 가정합니다. 그러나 거리를 킬로미터 또는 킬로미터로 제공 할 수도 있습니다. 둘 중 하나는 double. 하나의 angle(double dist) 마일 대 킬로미터에 입력 사이에 구별 할 수 없습니다이 경우

하지만 : angle_from_milesangle_from_kilomters 아주 쉽게 그렇게 할 수 있습니다.

+0

예를 들어, 'Duration' 클래스에서 사용했습니다 :'Duration :: Days','Duration :: Hours','Duration :: Minutes' ... 모두 같은 인수를 취합니다. 그것이받을 때 단위가 무엇이어야하는지 명확하게합니다. –

+0

enable_shared_from_this를 사용할 때도 유용합니다. http://mortoray.com/2013/08/02/safely-using-enable_shared_from_this/ –

7

내가 좋아하는 뭔가를 의미한다.

기본적으로 특정 매개 변수 집합을 전달해야하지만 내부적으로 개체를 다르게 구성해야하는 개체를 만들 때 사용됩니다. 당신은 같은 클래스가 예를 들어

:이를 위해

class AREA 
{ 
double area; 
AREA(int x); 
}; 

//how will you construct the object differently in case of circle and square?? 

, 우리는 관련 객체를 생성하는 데 도움이 생성자의 이름했다.

static AREA square(int x) 
{ return AREA(x*x); } 

및 따라서

static AREA circle(int x) 
{ return AREA(x*x*3.14); } //or a more accurate PI value 

, 우리가 필요한 지역으로 초기화 된 개체를 반환 관련 정적 함수를 호출 할 수 있습니다

그래서 우리는 클래스 내부 2 개 정적 메소드를 만들 수 있습니다.

참고 : 이들은 특정 클래스에 대한 개체를 만드는 동안 개체를 필요로하지 않아야하므로 정적입니다.

자세한 내용은 THIS을 확인하십시오.

1

가장 눈에 띄는 장점은 : 그것은 여러 생성자가 제공되는 callsite에서 인스턴스를 구축 구현을 지정 쉽게

  • . 이렇게하면 클래스가 여러 변형을 더 쉽게 제공 할 수 있습니다.
  • 이러한 변형은 이름이 다를 수 있지만 동일한 매개 변수 목록 (또는 컴파일러에서 선택할 매개 변수 목록을 선택할 때이를 모호하게 지정할 수 있음)이있을 수 있습니다.
  • callsite에서 구현이 호출하는 생성자를 읽을 수 있으므로 도움이됩니다.

또 다른 이유는 초기화 목록을 사용하는 대신 함수 본문에서 클래스를 초기화하는 것이 더 쉬운 경우도 있습니다.

관련 문제