2014-06-17 4 views
0

C++ 프로젝트에 TestClass 클래스가 있다고 가정합니다. 기본 생성자는 하나의 빈 매개 변수 목록입니다. 따라서 우리는 :클래스 기본 생성자

TestClass(); 
TestClass(int defaultParam = 0); 

이 두 가지는 기본 생성자로 간주 될 수 있습니까? 그리고 가능하다면 두 번째 라인과 같은 기본 생성자를 갖는 것이 윤리적입니까?

TestClass(void); 
TestClass(int defaultParam=0); 

+4

컴파일 해 보셨습니까? –

+0

감사합니다. 나는 이것이 가설적인 상황이라고 생각한다. 또한 잘 알고 있다면 컴파일러는 기본 생성자로 클래스를 초기화해야하는 경우에만 이러한 상황에 대해 경고합니다. – Victor

+2

그런 다음 시도해보십시오. 컴파일할지 확인하십시오. –

답변

2

중 하나는 기본 생성자로 사용할 수 있습니다. 컴파일러가 기본 생성자를 사용해야 할 때 컴파일러가 둘을 구분할 수 없기 때문에 둘 다 가질 때 문제가됩니다. 예 : 문체 이유로 귀하의 질문에

관계가없는

TestClass anObject; 
TestClass objectArray[5]; 

, 당신은 사용해야합니다

TestClass(); 

대신

TestClass(void); 

을 두 번째 형태는 C에서 지원 ++하지만 그건됩니다 필요 없습니다. 인수 유형이 void 인 경우에만 C에서 선언 함수가 하나 이상의 생성자가있는

+0

그래서 내가 두 사람 다 가질 것이기 때문에 내가 물었다. – Victor

+5

'(void)'는 실제로 관용어가 아니며, 더 필수적입니다. C에서'int foo()'는'foo'가 임의의 수의 인수를 취하므로'foo (42)'가 컴파일된다는 것을 의미합니다. 이를 고치려면 대신'int foo (void)'를 쓰고'foo (42)'가 컴파일되지 않도록하십시오. C++에서'int foo()'는 인자를 가지지 않고'foo (42)'는 컴파일되지 않기 때문에 'void'는 쓸데없는 잡음입니다. – nwp

+0

@nwp 나는'foo()'를 호출하기 위해'int foo (void)'선언 할 필요가 없기 때문에 관용구라고 말합니다. 'foo (42)'호출이 컴파일되는 것을 방지합니다. 'int foo()'를 선언하고'foo (42)'를 사용하면 링크가 발견 될 때까지 오류 감지가 지연됩니다. –

0

의 생성자 오버로드라고 할 때 필요합니다. 두 개의 기본 생성자가있는 경우 컴파일러는 객체를 만드는 동안 호출 할 생성자를 알 수 없으므로 오류를 생성합니다. 기본 생성자를 선언하지 않으면 컴파일러가 단독으로이를 수행합니다.