생성자의 이름이 클래스 이름과 같은 이유는 무엇입니까?C++의 생성자
C++의 생성자
답변
이것이 언어 사양이 말하는 것입니다. 파이썬 같은 일부 언어에서는 그렇지 않습니다.
이것은 언어의 정의에 불과합니다. 컴파일러는 같은 이름을 가진 메소드가 생성자임을 알고 있습니다. 이것은 또한 클래스의 객체를 매우 명확하게 만든다. 클래스를 모르는 사람들은 이름이 같으면 생성자라는 것을 안다.
원래 "클래스가있는 C"에서는 실제로는 아니 었습니다. "새로운"IIRC로 명명되었습니다. 어쨌든 C++에 대한 "왜"에 대한 질문은 "디자인과 진화의 C++"책에서 찾을 수 있습니다.
새로운 기능의 대안이 "혼란의 원천 이었기 때문에"Stroustrup에 따르면. 디자인 & Evolution of C++, 3.11.2 절을 참고하십시오. 이것이 제가 인용 한 완전한 정당성입니다.
편집 : 사람들이 지적했듯이 여러 가지 대안이 있습니다. 스몰 토크 (Smalltalk)는 다음과 같이 처리합니다.
myclass new
"new"메시지를 myclass 클래스 객체로 보냅니다. 물론, 여기에 C++ 솔루션은 조금 바보 같습니다
myclass myclass
분명히 분별하지 않습니다.
델파이는 OTOH, 명명 된 기능과 같은 태그를 추가하여 생성자가 될 수 있습니다 :
constructor Create;
constructor FooBar;
는 모두 모든 클래스에 대한 확인을 생성자 이름 일 것이다. 스몰 토크와 마찬가지로, 당신은 클래스 객체를 호출 할 필요가 : 이러한 모든 솔루션의
myclass.Create;
, 나는 C++ 하나는 가장 우아한 생각하고는 거의 보편적으로 후계자 언어로 채택 된 이유를 볼 수 있습니다 .
+1 이것은 내가 만들려고 한 부분입니다 ... 그러나 이것은 문서화와 함께 제공됩니다. –
@ Justin : 나는 당신의 대답이 다소 불공평하게 비판을 받았다고 생각한다. C++의 정의 된 표준 내에서, 정의 된 표준이 올바르게 작동한다는 점이 지적되었을 때, 생성자에 대한 호출을 할 필요가 없다는 의견이 지적되었다. 그런 식으로. – Cascabel
생성자가 기본 클래스의 생성자를 초기화 프로그램으로 호출하도록하려면 생성자 이름을 지정해야합니다. 이름이 모두 동일하면이 작업이 어려울 수 있습니다. 예 :
class Animal {
public:
Animal();
};
class Dog {
public:
Dog();
};
Animal::Animal() {
// Base class constructor
}
Dog::Dog() : Animal() {
// Derived class constructor, calling the base constructor as an initializer
}
Dog :: Constructor() : Animal :: Constructor() {}' –
어려운 말입니다. 그러나 실현 불가능한 것은 아니다. 기쁘게도 C++ 스펙은이 구문을 선택하지 않았습니다. – spoulson
는 C++ 언어 표준 :
12.1. 생성자에는 이름이 없습니다.
귀하의 질문은 혼란을 기반으로합니다. 생성자는 특수 선언 구문을 사용합니다. 여기서 클래스 이름은 멤버 이름 대신 사용됩니다. 나는 그 문법에 아무런 문제가 없다는 것을 알지 못하며, 당신의 질문을 유발할 수있는 것을 상상조차 할 수 없다.
그럼에도 불구하고 C++의 생성자에는 이름이 없습니다. 설계자는 생성자를 참조해야하는 C++의 컨텍스트가 없으므로 단순히 이름이 필요하지 않습니다.
실제로는 다릅니다. 12.1/1 :
생성자가없는 이름
특정 개체 건설/변환 구문을 사용하는 생성자를 호출 할 수있는 유일한 방법은 : 그것은 함수 이름 검색으로 찾을 수없는, 그리고 당신은 할 수 없습니다 생성자의 주소를 가져라. 이것은 아마도 좋은 일입니다.
나는 생성자를 선언하는 구문은 다음과 같이 뭔가를 보았다 수 있다고 생각 :
struct Foo {
int a;
constructor(int a) : a(a) { }
};
하지만 그 여분의 예약어, constructor
이 필요했을 것이다. 이는 생성자를 선언하는 코드가 객체를 생성하는 코드와 덜 유사하게 보일 것임을 의미합니다. 유일한 "이점"은 멤버 함수 이름으로 사용하기 위해 "Foo"를 해제하는 것입니다. 그건 나에게별로 도움이되지 않는 것 같아요. 특히 멤버 함수 이름으로 "생성자"를 잃을 것이기 때문입니다. Foo가 멤버 함수 이름으로 불평했다면 다른 방법으로 구현할 수 있었을 것입니다. 예를 들어 생성자를 선언 할 때 (+ Foo, ~ Foo, 아마도?) 약간 다른 구문을 사용하면됩니다. 그래서 나는 거기에 없었다고 생각한다.
C++에서 "사용자 이름이 지정된 생성자"가있는 시점을 즉시 볼 수 없습니다.
struct Foo {
static Foo bar(int);
};
과 같은 "생성자로 사용": 특정 매개 변수를 사용하고 푸를 반환 푸의 정적 멤버 함수를 원하는 경우에, 당신은 다음과 같이 선언 할 수
Foo f = Foo::bar(12);
대안은 무엇입니까? 아마도 :
- 모든 생성자 (예 :
new()
등)에 대한 하나의 이름을 가지고 같은 - 같은 생성자를 지정하는 새 키워드를 발명.
두 옵션 모두 실제보다 바람직하지 않은 것처럼 보입니다.
생성자를 지정하는 새로운 키워드가 잘못되었습니다 - 우리가 새로운 언어로 시선을 돌리고 있다고 가정 할 때? – sivabudh
@ ShaChris23 : 나는 아이디어에 * 잘못된 *이 있다는 것을 분명히 말하지 않았다. 단지 C++의 해결책이 주관적으로 더 좋았을 뿐이다. 키워드가 * 예약어 *이고 * 식별자 *로 사용될 수없는 경우 (C++ 에서처럼) 더 적은 것이 좋습니다. 생성자 식별에 대한 C++의 솔루션은 이러한 키워드를 완전히 중복되게 만듭니다. – Clifford
네가 한 말에 동의한다. – sivabudh
저는 여러분이 C++과 Object Oriented 프로그래밍에 익숙하다고 가정합니다. 먼저, 클래스 생성자가 무엇인지 이해했으면합니다.
대부분의 유형에는 초기화에 사용되는 일종의 생성자가 있습니다. int
프리미티브 또는 다른 유형의 변수에 대해서도 모든 것을 초기화 할 수 있습니다 ². 따라서 클래스를 만들 때 생성자이라는 초기화 프로그램을 제공해야합니다. 생성자는 필수 매개 변수를 가질 수 있습니다. 또한 오버로드되어 클래스가 많은 생성자를 가질 수 있습니다. 생성자는 초기화이기 때문에
그들에 대한 호출이 암시 적입니다 :
CMyObject obj;
: 클래스 생성자 때마다 당신은, 그 클래스의 객체를 생성 스택에 선언하여이
new
키워드를 사용하거나 할 호출됩니다
이제 클래스 내부에서 선언해야합니다. 그들은 결국 방법입니다 ... 그래서, 그 이름은 무엇입니까? 예를 들어, Python은 다른 접근법을 취하고 이렇게하기 위해 키워드 __init__
을 사용합니다. C++의 디자이너는 클래스의 이름이 될 것이라고 결정했습니다.
결국 클래스 이름을 가진 member-method를 사용하면 시스템에서 이름 충돌 (모호성)이 발생할 수 있기 때문에 의미가 있습니다.
² 을하지만 가끔은 그들이 실행 시간 비용을 줄이기 위해 수 없습니다 (같은 이름이 나쁘다는이 특정 범위의 멤버에 이름을 사용하는 이유는 기사의 this series에 대한 C#에도 불구하고, 그것은 명확히) .
이니셜 라이저 인 생성자가 자신의 호출을 암시 적으로 만드는 원인이라고 말하는 것은 잘못되었습니다. 생성자는 Delphi의 초기화 프로그램이지만 예를 들어 호출은 명시 적이며 원하는 이름을 가질 수 있습니다. –
- 1. 객관적인 c의 생성자
- 2. Ninject에서 생성자 생성자 상속
- 3. 생성자
- 4. 생성자
- 5. 재사용 가능한 생성자 C++
- 6. 를 상속 클래스와 전화 숨겨진 기본 생성자
- 7. 파이썬에서 체인 호출 상위 생성자
- 8. C의 알고리즘
- 9. C의 scanf와
- 10. 개인 생성자 및 공용 매개 변수 생성자
- 11. 이동 생성자 기본 클래스 이동 생성자
- 12. lua 생성자 함수에서 생성자 함수를 사용하는 경우
- 13. 오버로드 "기본"생성자 또는 "이"생성자?
- 14. 템플릿 생성자 대 템플릿 복사 생성자
- 15. 상위 생성자 앞에서 하위 클래스 생성자 호출
- 16. Java 생성자
- 17. 유니티 생성자
- 18. 복사 생성자 ++
- 19. Autofac는 생성자
- 20. 개인 생성자
- 21. 파이썬의 생성자
- 22. 저지 생성자
- 23. 복사 생성자
- 24. Groovy 생성자
- 25. 왜 생성자
- 26. C++ 생성자
- 27. 생성자 개선
- 28. 내부 생성자
- 29. 속성 생성자
- 30. 생성자 오류
음 ... 왜 안 되니? 다시 말하면, 질문을 쏟을 이유가 무엇인지 설명 할 때까지는 의미있는 답을하는 것이 불가능합니다. – AnT
@AndreyT : OP가 왜 언어가 그렇게 설계되었는지 묻습니다. 나는 Neil Butterworth의 대답이 의미있는 대답이 가능하다는 것을 증명했다고 생각합니다. – Cascabel
@AndreyT : 예를 들어 VB.NET 생성자에서는 'New'라는 특수 메서드 이름을 사용합니다. 사람은 이것을 물건을 더 분명하게하는 것으로 볼 수도 있습니다. 나는 C++을 처음 배울 때가졌을 것이라고 확신합니다. –