2010-04-12 4 views
6

생성자의 이름이 클래스 이름과 같은 이유는 무엇입니까?C++의 생성자

+0

음 ... 왜 안 되니? 다시 말하면, 질문을 쏟을 이유가 무엇인지 설명 할 때까지는 의미있는 답을하는 것이 불가능합니다. – AnT

+0

@AndreyT : OP가 왜 언어가 그렇게 설계되었는지 묻습니다. 나는 Neil Butterworth의 대답이 의미있는 대답이 가능하다는 것을 증명했다고 생각합니다. – Cascabel

+0

@AndreyT : 예를 들어 VB.NET 생성자에서는 'New'라는 특수 메서드 이름을 사용합니다. 사람은 이것을 물건을 더 분명하게하는 것으로 볼 수도 있습니다. 나는 C++을 처음 배울 때가졌을 것이라고 확신합니다. –

답변

1

이것이 언어 사양이 말하는 것입니다. 파이썬 같은 일부 언어에서는 그렇지 않습니다.

1

이것은 언어의 정의에 불과합니다. 컴파일러는 같은 이름을 가진 메소드가 생성자임을 알고 있습니다. 이것은 또한 클래스의 객체를 매우 명확하게 만든다. 클래스를 모르는 사람들은 이름이 같으면 생성자라는 것을 안다.

5

원래 "클래스가있는 C"에서는 실제로는 아니 었습니다. "새로운"IIRC로 명명되었습니다. 어쨌든 C++에 대한 "왜"에 대한 질문은 "디자인과 진화의 C++"책에서 찾을 수 있습니다.

10

새로운 기능의 대안이 "혼란의 원천 이었기 때문에"Stroustrup에 따르면. 디자인 & Evolution of C++, 3.11.2 절을 참고하십시오. 이것이 제가 인용 한 완전한 정당성입니다.

편집 : 사람들이 지적했듯이 여러 가지 대안이 있습니다. 스몰 토크 (Smalltalk)는 다음과 같이 처리합니다.

myclass new 

"new"메시지를 myclass 클래스 객체로 보냅니다. 물론, 여기에 C++ 솔루션은 조금 바보 같습니다

myclass myclass 

분명히 분별하지 않습니다.

델파이는 OTOH, 명명 된 기능과 같은 태그를 추가하여 생성자가 될 수 있습니다 :

constructor Create; 
constructor FooBar; 

는 모두 모든 클래스에 대한 확인을 생성자 이름 일 것이다. 스몰 토크와 마찬가지로, 당신은 클래스 객체를 호출 할 필요가 : 이러한 모든 솔루션의

myclass.Create; 

, 나는 C++ 하나는 가장 우아한 생각하고는 거의 보편적으로 후계자 언어로 채택 된 이유를 볼 수 있습니다 .

+0

+1 이것은 내가 만들려고 한 부분입니다 ... 그러나 이것은 문서화와 함께 제공됩니다. –

+0

@ Justin : 나는 당신의 대답이 다소 불공평하게 비판을 받았다고 생각한다. C++의 정의 된 표준 내에서, 정의 된 표준이 올바르게 작동한다는 점이 지적되었을 때, 생성자에 대한 호출을 할 필요가 없다는 의견이 지적되었다. 그런 식으로. – Cascabel

2

생성자가 기본 클래스의 생성자를 초기화 프로그램으로 호출하도록하려면 생성자 이름을 지정해야합니다. 이름이 모두 동일하면이 작업이 어려울 수 있습니다. 예 :

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 
} 
+0

Dog :: Constructor() : Animal :: Constructor() {}' –

+0

어려운 말입니다. 그러나 실현 불가능한 것은 아니다. 기쁘게도 C++ 스펙은이 구문을 선택하지 않았습니다. – spoulson

9

는 C++ 언어 표준 :

12.1. 생성자에는 이름이 없습니다.

귀하의 질문은 혼란을 기반으로합니다. 생성자는 특수 선언 구문을 사용합니다. 여기서 클래스 이름은 멤버 이름 대신 사용됩니다. 나는 그 문법에 아무런 문제가 없다는 것을 알지 못하며, 당신의 질문을 유발할 수있는 것을 상상조차 할 수 없다.

그럼에도 불구하고 C++의 생성자에는 이름이 없습니다. 설계자는 생성자를 참조해야하는 C++의 컨텍스트가 없으므로 단순히 이름이 필요하지 않습니다.

3

실제로는 다릅니다. 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); 
0

대안은 무엇입니까? 아마도 :

  • 모든 생성자 (예 : new() 등)에 대한 하나의 이름을 가지고 같은
  • 같은 생성자를 지정하는 새 키워드를 발명.

두 옵션 모두 실제보다 바람직하지 않은 것처럼 보입니다.

+0

생성자를 지정하는 새로운 키워드가 잘못되었습니다 - 우리가 새로운 언어로 시선을 돌리고 있다고 가정 할 때? – sivabudh

+0

@ ShaChris23 : 나는 아이디어에 * 잘못된 *이 있다는 것을 분명히 말하지 않았다. 단지 C++의 해결책이 주관적으로 더 좋았을 뿐이다. 키워드가 * 예약어 *이고 * 식별자 *로 사용될 수없는 경우 (C++ 에서처럼) 더 적은 것이 좋습니다. 생성자 식별에 대한 C++의 솔루션은 이러한 키워드를 완전히 중복되게 만듭니다. – Clifford

+0

네가 한 말에 동의한다. – sivabudh

0

저는 여러분이 C++과 Object Oriented 프로그래밍에 익숙하다고 가정합니다. 먼저, 클래스 생성자가 무엇인지 이해했으면합니다.

대부분의 유형에는 초기화에 사용되는 일종의 생성자가 있습니다. int 프리미티브 또는 다른 유형의 변수에 대해서도 모든 것을 초기화 할 수 있습니다 ². 따라서 클래스를 만들 때 생성자이라는 초기화 프로그램을 제공해야합니다. 생성자는 필수 매개 변수를 가질 수 있습니다. 또한 오버로드되어 클래스가 많은 생성자를 가질 수 있습니다. 생성자는 초기화이기 때문에

그들에 대한 호출이 암시 적입니다 :

CMyObject obj; 
: 클래스 생성자 때마다 당신은, 그 클래스의 객체를 생성 스택에 선언하여이 new 키워드를 사용하거나 할 호출됩니다

이제 클래스 내부에서 선언해야합니다. 그들은 결국 방법입니다 ... 그래서, 그 이름은 무엇입니까? 예를 들어, Python은 다른 접근법을 취하고 이렇게하기 위해 키워드 __init__을 사용합니다. C++의 디자이너는 클래스의 이름이 될 것이라고 결정했습니다.

결국 클래스 이름을 가진 member-method를 사용하면 시스템에서 이름 충돌 (모호성)이 발생할 수 있기 때문에 의미가 있습니다.

² 을하지만 가끔은 그들이 실행 시간 비용을 줄이기 위해 수 없습니다 (같은 이름이 나쁘다는이 특정 범위의 멤버에 이름을 사용하는 이유는 기사의 this series에 대한 C#에도 불구하고, 그것은 명확히) .

+0

이니셜 라이저 인 생성자가 자신의 호출을 암시 적으로 만드는 원인이라고 말하는 것은 잘못되었습니다. 생성자는 Delphi의 초기화 프로그램이지만 예를 들어 호출은 명시 적이며 원하는 이름을 가질 수 있습니다. –

0

생성자는 객체가 생성 될 때마다 호출되며 보통 이것은 자동으로 발생합니다. 즉 컴파일러는 반환 데이터 유형이없는 함수 호출 인 생성자를 호출합니다. 따라서 C++ 언어는이 함수를 클래스 이름으로 지정하기로 결정했습니다.

+1

스팸은 무엇인가요? – GManNickG

+0

"그러므로"이후의 부분은 이전의 부분에서 전혀 따르지 않습니다! – Clifford