2013-07-06 2 views
6

저는 최근에 1 권을 읽었습니다. 브루스 에켈 (Bruce Eckel)이 생각한 C++의 사고 방식에 대한 지식을 바탕으로 지식을 실제 활용에 적용하는 방법을 살펴 보았습니다.왜 생성자를 C++에서 정적으로 선언 할 수 없습니까?

나는 최근에 정적 멤버 함수로 작업 한 컴파일러 불행이었다있는 생성자가 정적 만드는 시도. 나는 그 책에서 이유를 조사했지만 아무 것도 찾을 수 없었다.

이유를 설명 할 수 있습니까?

P .: 일부 응답을보고 나서 C# (및 Java)에서 생성자를 정적으로 선언 할 수 있다는 혼돈이 있음을 알리고 싶습니다.

+5

먼저 정적 생성자가 무엇을 기대 하시겠습니까? 누락 된 기능에 대한 확고한 이유를 찾을 수 없다면 그 기능을 사용하는 것이 무엇입니까? –

+0

나는 그 클래스의 생성자를 직접 호출하여 객체를 생성함으로써 해킹 할 것이다. static은 모든 멤버 객체를 정적으로 만들 것이지만, 유일한 이유는 무엇입니까? – Sankalp

+0

정적이 아닌 클래스의 생성자를 직접 호출 할 수 있습니다. –

답변

11

생성자의 목적은 의 인스턴스를 클래스의 인스턴스으로 초기화하는 것입니다.

정적 메서드에는 연결된 인스턴스가 없습니다.

따라서 정적 생성자와 같은 것은 없습니다.

+1

글쎄 C++은 C#이하는 것과 같은 방식으로 정적 생성자를 정의 할 수도 있고 정적 초기화 블록을 사용하여 Java를 정의 할 수도 있습니다. 정적 생성자는 특히 그 자체로 비 센스는 아닙니다. – log0

+3

@ log0 링컨이 말했듯이, 개는 꼬리를 다리라고 부르더라도 4 개의 다리 만 있습니다. MS가 무엇을 호출하든 관계없이 C#의 클래스 초기화 프로그램은 생성자가 아닙니다. "정적 생성자"는 실제로 말도 안됩니다. C++은 나중에 생성자와 같은 구문이나 자바와 유사한 구문 또는 클래스 초기화 프로그램을 제공하는 다른 구문을 사용할 수 있지만 구문이 사용하는 구문에 관계없이 생성자는 아닙니다. –

+0

@JimBalter : 생각을 즐겁게하기 위해 여기에 생각을위한 음식이 있습니다. 사실 "constructor"이라는 단어는 ** C++, C#, Java 등의 모든 경우 ** 잘못된 용어입니다. "올바른 용어를 사용하는 유일한 언어 "파이썬입니다. 이니셜 라이저 ('__init__')는 C++, C#, Java 등에서"생성자 "가하는 일을 정확하게 수행합니다. 즉 인스턴스 필드를 초기화합니다. 반대로, 진정한 "생성자"는 파이썬의'__new__'과 동일 할 것입니다. "건설"작업은 메모리를 할당하는 것입니다 (아마도 C++의'new' 또는 C의'malloc'을 통해) 그리고 ** ** ** * 이니셜 라이저 * ("constructor"라고 부름)를 호출하십시오. – Mehrdad

1

과 같은 언어는 이러한 기능을 제공하지 않습니다하지만 간접적으로 시뮬레이션 할 수 있습니다. 자세한 내용은 this answer을 참조하십시오. 왜 그런 일을해야하는지 절대 확신 할 수 없습니다.

0

생성자 멤버 함수는 기존 할당을 사용하여 지정된대로 객체를 생성합니다. 즉, this이 있습니다.

static 멤버 함수는 객체에 대한 저장소를 지정하지 않으므로 연결할 인스턴스가 없습니다. 즉, this이 없습니다. 따라서 정적 생성자를 지정할 수 없습니다. C의

class t_object { 
public: 
    static t_object Func(…optional parameter list…) { 
    t_object result(…ctor parameters…); 
    …initialize result… 
    return result; 
    } 
    ... 
}; 
0

한 매우 유용한 기능 ++ C가 적절한 초기화 및 청소를위한 적절한 방법을 제공합니다 이상 :

은 아마 당신은 값으로 인스턴스를 반환하는라는 이름의 정적 멤버 함수를 찾고 있습니다 사용자 정의 유형의 인스턴스가 만들어져 잘 구성된 객체가 작업을 시작할 준비가되었습니다.

언어 생성자와 소멸자의 메커니즘을 통해이를 달성 할 수있다.

당신은 생성자와 소멸자가 존재하는 이유는 생성 된 인스턴스를 유지하기위한 참고도 모르기 때문에.

이제 static은 모든 개체가 사용할 수있는 공통점이있을 때 사용되거나 적어도 사용됩니다. 여러분이 만드는 클래스의 모든 인스턴스들 사이에서 공유 될 무언가가 실제로있을 때 이것을 사용합니다.

그리고 클래스의 정적 데이터 멤버에 대한 인터페이스는 주로 정적 데이터 멤버에서 사용되는 정적 멤버 함수를 통해 제공됩니다. 생성자는 그것이 아마도 그래서 그림으로 온 이유는 정적 제작하여 주어진 정의는 이성의 라인 still 것을 의미한다 무엇을 고정 할 할 수있는 경우

그래서, (제대로 객체를 초기화하는 당신이 그것을 잡기 전에). 그래서 아무 객체도 없다면 생성자/소멸자를 갖는 것이 이치에 맞지 않습니다.

위의 행을 생각해 보면 적어도 C++에서는 생성자를 정적으로 유지하는 것이 바람직하지 않습니다. 따라서이 언어에서는 지원되지 않습니다.

관련 문제