기본 인수
Default argument컴퓨터 프로그래밍에서 기본 인수는 프로그래머가 지정할 필요가 없는 함수에 대한 인수입니다.대부분의 프로그래밍 언어에서 함수는 하나 이상의 인수를 사용할 수 있습니다.보통 각 인수는 완전히 지정해야 합니다(이것은 C 프로그래밍[1] 언어의 경우).이후 언어(예를 들어 C++)에서는 프로그래머가 함수를 호출할 때 값을 지정하지 않더라도 항상 값을 갖는 기본 인수를 지정할 수 있습니다.
C++ 디폴트 인수
다음 함수 선언을 고려합니다.
인트 마이펑(인트 a, 인트 b, 인트 c = 12); 이 함수는 3개의 인수를 사용합니다.이 중 마지막 인수의 기본값은 12입니다.프로그래머는 이 함수를 두 가지 방법으로 호출할 수 있습니다.
인트 결과 = 마이펑(1, 2, 3); 결과 = 마이펑(1, 2); 첫 번째 경우 c라는 이름의 인수 값이 normal로 지정됩니다.두 번째 경우 인수는 생략되고 기본값 12가 대신 사용됩니다.
인수가 발신자에 의해 지정되었는지, 디폴트값이 사용되었는지 여부를 알 수 있는 방법은 없습니다.
상기의 메서드는 파라미터의 유무에 관계없이 함수를 호출할 수 있도록 디폴트 기준을 설정하는 경우에 특히 도움이 됩니다.다음 사항을 고려하십시오.
무효 인쇄 그리팅(표준::스트림& 개울. = 표준::외치다) { // 지정된 스트림에 메시지를 출력합니다. 개울. << > "헬로우 월드!"; } 함수 호출:
인쇄 그리팅(); 는, 디폴트로 표준 출력에 「hello world!」를 인쇄합니다. std::cout(일반적으로 화면).한편, 타입의 오브젝트는std::ostream이제 동일한 함수로 전달될 수 있으며 함수는 표준 출력이 아닌 지정된 스트림으로 인쇄됩니다.
인쇄 그리팅(표준::cerr); 디폴트 인수의 값은 호출되는 함수의 본문이 아닌 콜사이트에서 "채움"되기 때문에 가상 함수는 콜이 이루어지는 포인터 또는 참조의 정적 유형에서 기본 인수 값을 가져옵니다.가상 함수의 본문을 공급하는 객체의 동적 유형에서가 아닙니다.
구조 기초 { 가상 표준::짝< >인트, 인트> 푸우(인트 x = 1) { 돌아가다 {x, 1}; } }; 구조 파생된 : 일반의 기초 { 표준::짝< >인트, 인트> 푸우(인트 x = 2) 덮어쓰다 { 돌아가다 {x, 2}; } }; 인트 주된() { 파생된 d; 기초& b = d; 주장하다(d.푸우() == 표준::make_filengths(2, 2)); 주장하다(b.푸우() == 표준::make_filengths(1, 2)); } 오버로드된 메서드
Java 등 일부 언어에는 기본 인수가 없습니다.단, 메서드오버로드를 사용하여 같은 이름의 오버로드된 메서드를 생성하여 동일한 동작을 시뮬레이트할 수 있습니다.인수가 적은 버전은 단순히 더 많은 인수를 가진 버전을 호출하고 기본 인수를 누락된 인수로 지정합니다.
인트 마이펑(인트 a, 인트 b) { 돌아가다 마이펑(a, b, 12); } 인트 마이펑(인트 a, 인트 b, 인트 c) { /* 주요 실장 */ } 그러나 다른 몇 가지 단점 외에도 기본 인수가 유형 시스템에서 모델링되지 않기 때문에 콜백 유형(일명 고차 함수)은 과부하를 받아들이거나 과부하 함수로 기본 인수를 시뮬레이션할 수 없습니다.반면 JavaScript에서 오버로드되지 않은 함수 정의는 입력 값이 다음과 같은 경우 기본값을 대체할 수 있습니다.undefined(암묵적으로 그런지는 상관없습니다).undefined콜 사이트에 인수가 없거나 명시적으로 전달됨으로써undefinedvalue); 옵션 인수 파라미터 유형으로 모델링됩니다.?: TypeScript에 있습니다.JavaScript의 솔루션은 정적으로 해결되지 않습니다(즉, 컴파일 시에 해결되지 않습니다).따라서 TypeScript는 옵션만 모델화하고 함수의 타입 시그니처의 디폴트 값은 모델화하지 않습니다).따라서 콜백이 중앙에서 디폴트값을 독립적으로 제어할 수 있다는 점에서 더 유연한 런타임 오버헤드가 발생합니다.ly는 콜백을 입력하는 함수의 (의 콜백유형 시그니처)유형 시그니처에 의해 지시됩니다.TypeScript 솔루션은 다음 명령어를 사용하여 Java에서 시뮬레이트할 수 있습니다.Optional암묵적인 것을 제외한 활자undefined각 부재의 인수는 명시적이다Optional.<Integer>absent()콜사이트에서요.
평가하기
모든 함수의 호출 디폴트 인수 값은 호출된 함수에 전달해야 합니다.
디폴트 인수 값에 부작용이 포함되어 있는 경우 이러한 부작용이 평가될 때 중요합니다.프로그램 전체(파싱 시간, 컴파일 시간 또는 로드 시간)에 1회 또는 함수 호출마다 1회, 콜 시간에 1회입니다.
Python은 함수 선언을 평가할 때 기본 인수의 식을 한 번 평가하는 주목할 만한 언어입니다.함수별 평가를 필요로 하는 경우 다음과 같이 default 인수를 sentinel 값으로 설정하여 복제할 수 있습니다.Nonesentinel 값이 전달된 경우에만 함수 본문에 기본값의 부작용을 평가하도록 합니다.
예를 들어 다음과 같습니다.
수입품 랜덤 방어하다 열심인(a=랜덤.랜덤()): 돌아가다 a x = 열심인() y = 열심인() 주장하다 x == y 방어하다 게으른(a=없음.): 한다면 a 이 없음.: a = 랜덤.랜덤() 돌아가다 a x = 게으른() y = 게으른() 주장하다 x != y 정도
일반적으로 default 인수는 파라미터에 의해 전달된 인수 또는 함수 시작 시 선언된 로컬 변수와 동일하게 동작하며 파라미터 또는 기타 로컬 변수(기능 종료 시 할당 해제되는 자동 변수)와 동일한 범위 및 범위(라이프 타임)를 가집니다.
그 외의 경우 default 인수가 스태틱하게 할당될 수 있습니다.변수가 변동 가능한 경우 정적 변수와 마찬가지로 함수 호출 간에 값이 유지됩니다.
이 동작은 목록과 같은 가변 유형에 대해 Python에서 볼 수 있습니다.평가와 마찬가지로 로컬 변수와 동일한 범위를 보장하기 위해 sentinel 값을 사용할 수 있습니다.
방어하다 열심인(a=[]): 돌아가다 a x = 열심인() x += [1] 주장하다 열심인() == [1] 방어하다 게으른(a=없음.): 한다면 a 이 없음.: a = [] 돌아가다 a x = 게으른() x += [1] 주장하다 게으른() == [] 레퍼런스
- ^ Leslie, Martin. "Default Parameters". C++ Programming Reference. Archived from the original on 9 October 2011. Retrieved 13 January 2012.