Namespaces
Variants

Functions

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

함수는 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++는 익명 함수 를 구현하기 위해 람다 표현식 을 사용합니다.

(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 이후) 가 포함됩니다).