Functions
함수는 C++ 개체로, 일련의 statements ( function body )를 name 및 0개 이상의 function parameters 목록과 연결합니다.
// 함수 이름: "isodd" // 매개변수 목록에는 "n"이라는 이름의 int 타입 매개변수가 하나 있음 // 반환 타입은 bool bool isodd(int n) { // 함수 본문 시작 return n % 2; } // 함수 본문 끝
함수가 호출될 때, 예를 들어 함수 호출 표현식 에서, 매개변수는 인수들(호출 위치에서 제공되거나 기본값이 지정된 )로부터 초기화되고 함수 본문의 명령문들이 실행됩니다. 만약 매개변수 목록 이 ... 로 끝나면, 함수에 추가 인수를 제공할 수 있으며, 이러한 함수를 가변 인수 함수 라고 합니다.
int main() { for (int arg : {-3, -2, -1, 0, 1, 2, 3}) std::cout << isodd(arg) << ' '; // isodd가 7번 호출되며, 매번 // n이 arg로부터 복사 초기화됨 }
Unqualified 함수 이름이 함수 호출 표현식에서 사용될 때는 "인수 의존 탐색" (ADL) 이라는 추가 규칙 집합으로 탐색됩니다.
함수는 반환(returning) 하거나 예외를 던져(throw) 예외(exception) 를 발생시켜 종료할 수 있습니다.
|
함수는 coroutine 일 수 있으며, 이 경우 실행을 일시 중단했다가 나중에 재개할 수 있습니다. |
(since C++20) |
함수 선언은 어떤 범위에서든 나타날 수 있지만, 함수 정의 는 네임스페이스 범위에서만, 또는 멤버 함수와 friend 함수의 경우 클래스 범위에서만 나타날 수 있습니다. friend 지정자 없이 클래스 본문에서 선언된 함수는 클래스 멤버 함수입니다. 이러한 함수는 많은 추가적인 속성을 가지며, 자세한 내용은 멤버 함수 를 참조하십시오.
함수는 객체가 아닙니다: 함수의 배열은 존재하지 않으며 함수는 값으로 전달되거나 다른 함수에서 반환될 수 없습니다. 함수에 대한 포인터와 참조( main 함수 와 대부분의 표준 라이브러리 함수 (C++20부터) 제외)는 허용되며, 이러한 함수 자체가 사용될 수 없는 상황에서 사용될 수 있습니다. 따라서 우리는 이러한 함수들이 "주소 지정 가능하다"고 말합니다.
각 함수는 타입을 가지며, 이는 함수의 반환 타입, 모든 매개변수의 타입들(배열-투-포인터 및 함수-투-포인터 변환 후,
매개변수 목록
참조)
, 함수가
noexcept
인지 여부
(C++17부터)
, 그리고 비정적 멤버 함수의 경우 cv-qualification
및 ref-qualification
(C++11부터)
으로 구성됩니다. 함수 타입은 또한
언어 링크
를 가집니다. cv-qualified 함수 타입은 존재하지 않습니다(
cv-qualified 함수
의 타입, 예를 들어
int
f
(
)
const
;
와 혼동하지 마십시오). 또는
cv-qualified 타입
을 반환하는 함수, 예를 들어
std::
string
const
f
(
)
;
과 혼동하지 마십시오). 함수 타입의 별칭에 cv-qualifier가 추가된 경우, 모든 cv-qualifier는 무시됩니다.
동일한 범위 내에서 여러 함수는 매개변수 목록과 (비정적 멤버 함수의 경우) cv /ref (since C++11) -한정자가 서로 다르다면 동일한 이름을 가질 수 있습니다. 이를 function overloading (함수 오버로딩)이라고 합니다. 반환 타입 및 noexcept 지정자 (since C++17) 만 다른 함수 선언은 오버로드할 수 없습니다. address of an overloaded function (오버로드된 함수의 주소)는 다른 방식으로 결정됩니다.
| (C++11부터) |
함수 객체
함수 좌측값 외에도, 함수 호출 표현식은 함수에 대한 포인터와 함수 호출 연산자를 오버로드하거나 함수 포인터로 변환 가능한 클래스 타입의 모든 값을 지원합니다 ( 람다 표현식 포함 ) (C++11부터) . 이러한 타입들을 통칭하여 FunctionObject s 라고 하며, 이들은 C++ 표준 라이브러리 전체에 걸쳐 편재합니다. 예를 들어 BinaryPredicate 와 Compare 의 사용 예를 참조하십시오.
표준 라이브러리는 또한 여러 사전 정의된 함수 객체 템플릿 과 새로운 것을 구성하는 방법들을 제공합니다 (여기에는 std::less , std::mem_fn , std::bind , std::function (C++11 이후) , std::not_fn (C++17 이후) , std::bind_front (C++20 이후) , std::bind_back , std::move_only_function (C++23 이후) , std::copyable_function , 그리고 std::function_ref (C++26 이후) 가 포함됩니다).