2011-03-13 4 views
2

// 함수에 반환 형식이 지정 되었기 때문에 우리는 항상 함수의 반환 형식을 지정합니다 .....하지만 누구나 함수의 반환 형식을 지정하여 어떤 기본 목표를 제공하는지 알 수 있습니다. ........ 왜 구문을 이렇게 만들어야하는지 ..... ..... 값을 반환 할 수 있다는 것을 의미합니다.함수의 반환 유형이 필요합니다.

+1

이전에는 함수를 지정하지 않은 경우 함수가'int'를 반환한다고 가정 했었습니다. – Gabe

답변

7

함수 선언에 형식을 지정해야합니다. 왜냐하면 모든 함수 선언이 정의가 아니기 때문입니다.

f(int x); 

f(42)의 유형은 무엇입니까 : 예를 들어, 반환 형식이 필요하지 않은 경우 우리가 할 수있는 다음 선언을 고려? 이 선언에서 알 수있는 방법이 없으므로 리턴 유형을 지정해야합니다.

g(bool b) { 
    if (b) { 
     return C(); 
    } 
    return 0.0; 
} 

g의 리턴 타입은 무엇을해야 :

또는 정의 다음과 같은 기능이 고려 (C 가정은 어떤 클래스입니다)? double이거나 C 일 수 있습니다.

C++은 실제로 형식 유추가없는 C를 기반으로하므로 "이와 같이 구성되어야합니다"라는 구문이 사용됩니다. C++은 다른 언어로 작성되었을 수 있습니다.이 경우에는 "이렇게 만들어야 만합니다"하지만 C++은 완전히 다른 언어입니다. 람다 표현식 몸이 하나의 return 문으로 구성되어 있다면, 람다의 반환 유형의 유형으로 추론됩니다 : C++ 0X 함수의 반환 형식 추론 할 수있는 하나 개의 장소를 추가하는

return 문에서 표현식 (람다가 다른 형식 인 경우 반환 유형이 명시 적으로 지정되지 않은 경우 void으로 추론됩니다). 따라서 다음은 동일합니다 :

[]() -> int { return 42; } 
[]() { return 42; } 

람다는 정의하지 않고 람다를 선언 할 수 없으므로 특수합니다.

+0

+1 : 더 좋은 예제 : P –

+0

그렇다면 컴파일러가 람다처럼 단일 return 문으로 구성된 함수의 반환 유형을 추론 할 수있는 가능성을 확장하지 않으시겠습니까? 그것은 어떤 경우에는 많은 도움이 될 것입니다. 미래에 일어날 수 있을까요? – rafak

1

정확히 같은 이유로, 함수가받는 인수의 유형을 지정하십시오.

function f(int x) { if (x == 0) return x; else return (x == 0); } 

어떤 것 반환 f를 -

또한, 당신은 반환 값을 지정하지 않은 가정?

1

C++는 strongly typed 언어로 설계되었으므로 반환 값의 유형을 지정하면 컴파일러에서 호출자가 호출 된 함수에 의해 반환되는 형식을 예상하는지 확인할 수 있습니다. 이 a.o. 런타임이 아닌 컴파일 타임에 프로그램의 논리 오류를 감지 할 수 있습니다. 약식 프로그래밍 언어 (예 : perl)에서는 return 유형을 지정하지 않아도됩니다. 각각에는 인터넷에 충분한 정보를 찾아내는 그것의 자신의 이점 또는 불리가있다.

+0

이것은 "강한"대 "약한"타이핑과는 아무런 관련이 없으며, 타입 유추 가능성과 관련이 있습니다. 대부분의 유형을 유추하는 경우 "강력하게"입력 된 언어를 사용할 수 있습니다 (예 : F #). 문제는 C++에서 언어가 여러 유형 (명시 적 형변환, 암시 적 변환, 변환 함수, 변환 생성자 등)간에 변환 할 수있는 많은 방법을 가지고 있으므로 유형을 유추하는 것이 어렵거나 불가능하다는 것입니다. –

0

글쎄, 몇 가지 이유가 있습니다 :

  1. C++은 C "구축"하고, 그 당신은 그것을 정의하지 않고 함수를 선언 할 수는 C.
  2. 에 있던 방법입니다.
  3. 컴파일러는 오류를 catch 할 수 있습니다.
1

에는 반환이 존재하지 않는 경우에, 우리는이 조각의 마지막 줄에 쓸 수 없습니다 : b 이후

f(int a) 
{ 
    if (a == 0) return 100; 
    else   return "a is not zero"; 
} 

//ambiguous return type 
int a = f(b); // b is known at runtime! 

런타임에 알려져있다, 우리는 기능 f 반환 여부를 결정할 수 없습니다 100 또는 문자열 a is not zero; 반환 값을 결정할 수 없으면 호출 사이트에서 반환 값 유형을 결정할 수없고 쓸 수 없습니다. 즉 const char* c = f(b) 일 수도 있으므로 int a = f(b)을 쓸 수 없습니다.

동적 유형의 언어의 경우 가능합니다. 하지만 C++은 그렇게하지 않습니다. C++은 정적으로 형식이 지정된 언어입니다. 즉, 유형을 컴파일 할 때 알아야합니다.

관련 문제