2011-01-05 4 views
13

생성자를 "명시 적"으로 표시하는 것을 잊는 것은 매우 쉽습니다 : args 추가/제거, 옵션 선택 등. 모든 신뢰할 수있는 방법은 명시 적으로 모든 생성자를 선언 한 다음 implicitness가 디자인에 필요하면이 키워드를 제거하는 것입니다. (단일 인수 생성자 만이 아니라 이것을 허용하는 표준 덕분에). 그러나 이것은보기 흉하게 보일 것입니다.생성자가 기본적으로 명시 적이지 않은 이유는 무엇입니까?

암시 적 생성자는 암시 적 변환 (예 : 잘못된)의 사용을 의도하지 않습니다. here으로. 우연히 발생할 수 있거나 이전 버전과의 호환성을 깨뜨릴 수 있습니다.

이렇게하면 버그가 줄어들면 "명시 적"이 생성자의 기본 특성이 아닌 이유는 무엇입니까?

p.s. 예, Stroustrup의 "The Design and Evolution of C++"를 읽었습니다. "explicit"에 대해 말하면 기억하지 못합니다.

+0

"잊어 버림"이 경험과 함께 없어집니다. –

+3

@ 유전자 : 시야에있는 모든 것을 '명백하게'하고자하는 것처럼. –

+0

@robin 후드 : 링크에 관해서는 내 관점에서 암시 적 변환과 관련된 문제는 아니지만 "함수가 A 객체 만 사용한다는 것을 알지 못하는 바보 프로그래머는 A 객체를 통해 매번 생성 될 것입니다. 고리." 문제가 놀랄만 한 코드 효과라면, 대답은 언어를 어지럽히 기보다는 더 나은 프로그래머가되어야합니다. 물론 세계의 C#/Java/VB 팬들도 서로 다른 의견을 가지고 있습니다. –

답변

12

명시 적 추가시의 이전 버전과의 호환성. 언어는 진화하고 있으며 진화하는 언어로 기존 구조물의 의미를 바꾸는 것은 사용자를 화나게하는 확실한 방법입니다. 지금도 마찬가지입니다. 역 호환성은위원회의 마음 속에있는 것입니다.

+0

마음 만이 아닙니다. 그것은 위임입니다. –

+0

(음, 적어도 대부분은 새로운 키워드가 몇 가지 논란이되고 있습니다 ... 그들은 아무도 소개하지 않기 위해 최선을 다합니다!) –

3

흥미로운 관점. 나는 다른면을 취하는 경향이 있으며, 왜 증명할 때까지 모든 생성자를 표시해야한다고 생각하는지 궁금합니다. explicit?

정직하게도 나는 귀하의 질문에 대한 답을 알지 못합니다. 이전 버전과의 호환성은 가장 가능성이 높은 이유로 경쟁자가 될 수 있지만 다시 암시 적 변환을 방지하려는 이유는 무엇입니까?

+6

암시 적 변환으로 인해 때때로 놀라운 프로그램 동작이 발생합니다. 나는 좋은 예를 기억하고 싶다. 나는 그것이 대부분의 경우 해롭다는 것보다 더 도움이된다는 것을 느낍니다. –

+4

형식 일치는 표현 적법성 및 과부하 해결과 같은 것들에 대해 C++에서 중요하며, 비 - "명시 적"생성자는 이러한 목적을위한 유형 변환기입니다. 예를 들어'A :: A (B b)'와'foo (A a)'가 선언 되었다면,'B b; foo (b);는 합법적 인 것이므로 종종 오류로 표시하려고합니다. 자동 변환은 과부하 기능의 놀라운 선택을 강요 할 수 있으며, 놀라움이 나쁜 것은 아무것도 없습니다. 일반적으로 C++ 프로그래머는 묵시적인 타입 변환이 점점 더 나빠지는 것에 점점 더 동의하는 것처럼 보입니다. –

+1

(의도하지 않은) 암시 적 유형 변환을 사용하지 않으므로 열립니다. 여기에 : http://en.allexperts.com/q/C-1040/2010/2/C-Implicit-Conversion.htm. 이는 실수로 발생할 수 있거나 이전 버전과의 호환성을 손상시킬 수 있습니다. 이 예제를 포함하도록 수정 된 원본 게시물 –

8

C++을 구상했을 때 아무도 바보 같은 코드를 작성하지 않아 모든 사람들이 좋은 암시 적 변환을 통해 모든 곳에서 캐스트를 쓰지 않아도된다는 장점을 누릴 수 있다고 생각했기 때문입니다.

물론 이것은 틀린 것으로 밝혀졌습니다. 그리고 실제로는 버그가있는 생성자 이 있습니다.. 그런 수치심.

+4

+1 나는 이것이 나를 위해 그것을 요약했다고 생각한다. 그렇다면 프로그래머가 어리석은 코드를 작성하는 문제는 무엇이되어야할까요? 많은 사람들이 언어를 더 간단하게 만들어야한다는 생각 때문에, 바보 같은 프로그래머는 바보 같은 코드를 작성할 수 없습니다.내 생각에 프로그래머를 더 똑똑하게 만드는 것이 낫다. 더 나은 프로그래머는 더 나은 프로그램을 작성합니다. –

+0

결함이있는 생성자가있는 것 외의 명시 적 생성자를 원하는 많은 유효한 이유가 있습니다. 어리석은 코드로 작성하는 것은 올바르지 않습니다. –

+0

나는 John에 동의합니다. –

관련 문제