함수 C++ 예

Hamsu C Ye



함수처럼 작동하는 C++ 클래스를 펑터(Functor)라고 합니다. 동일한 이전 함수 호출 구문이 펑터를 호출하는 데 사용됩니다. 펑터를 생성하기 위해 'operator()'를 오버로드하는 객체를 만듭니다. 함수나 함수 포인터로 해석될 수 있는 객체를 펑터(functor)라고 부를 수도 있습니다. 파라메트릭 데이터 유형의 값을 사용하여 기능적 효과를 모델링할 때 '펑터'가 매우 편리합니다. 이번 글에서는 C++ 코드와 함께 functor 개념을 자세히 공부하겠습니다.

예시 1:

“iostream”은 이 헤더 파일에 선언된 함수를 활용해야 하기 때문에 여기에 포함시키는 헤더 파일입니다. 'iostream' 헤더 파일에는 함수 선언이 포함되어 있습니다. 'std' 네임스페이스도 여기에 추가됩니다. 그런 다음 'FunctorClass'라는 클래스를 생성합니다. 그 아래에는 공개 생성자인 “public”을 입력하고 “operator()” 함수를 배치합니다. 그런 다음 'cout' 문에 화면에 렌더링하려는 문장을 배치합니다.

그런 다음 “main()” 함수를 호출한 다음 “my_functor”라는 이름으로 “FunctorClass” 개체를 생성합니다. 여기서는 'my_functor()' 함수를 호출하여 'operator()' 함수 아래에 추가한 명령문을 표시합니다.







코드 1:



#include
사용하여 네임스페이스 성병 ;
수업 FunctorClass {
공공의 :
무효의 운영자 ( ) ( ) {
시합 << '여기서 작전이 호출됩니다' ;
}
} ;
정수 기본 ( ) {
Functor클래스 my_functor ;
my_functor ( ) ;

반품 0 ;
}

산출:



“FunctorClass”의 “operator()” 함수에 추가한 줄은 “my_functor” functor 객체를 활용하여 여기에 표시됩니다.





예 2:

일부 함수 선언이 'iostream' 헤더 파일에 포함되어 있으므로 여기에 'iostream' 헤더 파일을 포함합니다. 'std' 네임스페이스도 삽입됩니다. 다음으로 'SquareClass'라는 클래스를 만듭니다.



그 아래에는 공개 생성자인 'public'을 입력하고 그 아래에 'int' 데이터 유형의 'operator()' 함수를 배치합니다. 'int' 데이터 유형의 'val' 변수를 이 'operator()' 함수에 전달합니다. 이 함수는 “operator()” 함수 아래의 “return()” 함수에 “val * val”을 삽입하여 곱셈 결과를 반환합니다.

이제 여기서 “main()” 함수가 호출됩니다. 그런 다음 여기에 'SquareFunctor' 클래스의 's_functor'라는 이름으로 개체가 생성됩니다. 그런 다음 정보 렌더링을 돕는 'cout'을 활용합니다. 이후 여기서는 “my_functor()” 객체를 함수처럼 호출하는데, 호출 시 매개변수로 “5”를 추가했기 때문에 “5 * 5”의 곱셈 결과를 반환합니다.

코드 2:

#include
사용하여 네임스페이스 성병 ;
수업 SquareClass {
공공의 :
정수 운영자 ( ) ( 정수 ) {
반품 ( * ) ;
}
} ;
정수 기본 ( ) {
SquareClass s_functor ;
시합 << '주어진 값의 제곱은 ' << ;
시합 << s_함수 ( 5 ) ;

반품 0 ;
}

산출:

“my_functor()” 함수처럼 “SqaureClass” 클래스의 “my_functor” 객체를 호출한 후 “5”를 전달한 후 출력을 얻습니다. 숫자 '5'의 제곱으로 '25'를 얻습니다.

예시 3:

'iostream' 헤더 파일은 함수 선언을 포함하고 있기 때문에 여기에 포함되었으며 'std' 네임스페이스는 나중에 도입되었습니다. 그런 다음 'ProductFunctor' 클래스가 만들어집니다. 공개 생성자 'public'이 그 아래에 입력되고 'int' 데이터 유형의 'operator()' 함수가 그 아래에 배치됩니다. 여기에서 이 함수를 재정의하고 'int var1' 및 'int var2'라는 두 개의 매개변수를 전달합니다.

그런 다음 아래의 'return'을 활용하고 두 숫자 'var1 * var2'의 곱셈 결과를 반환하는 두 변수를 곱합니다. 그런 다음 'main()' 함수가 여기에서 호출되고 'ProductFunctor' 클래스의 'P_functor'라는 이름으로 클래스 개체를 생성합니다. 그런 다음 'pro_result'라는 이름으로 새 변수를 초기화하고 'P_functor' 개체를 호출한 후 'P_functor()' 함수로 할당합니다.

매개변수로 '28'과 '63'을 전달합니다. 그러면 두 값을 모두 곱하고 'cout'을 사용하고 'pro_result'를 전달하여 아래에 인쇄하는 'pro_result' 변수에 결과를 저장합니다.

코드 3:

#include
사용하여 네임스페이스 성병 ;
수업 ProductFunctor {
공공의 :
정수 운영자 ( ) ( 정수 var1, 정수 var2 ) {
반품 var1 * var2 ;
}
} ;
정수 기본 ( ) {
ProductFunctor P_functor ;
정수 prod_result = P_함수 ( 28 , 63 ) ;
시합 << '제품은 : ' << prod_result << ;
반품 0 ;
}

산출:

“P_functor” 객체를 “P_functor()” 함수로 호출하고 값을 전달한 후 제품을 얻습니다. 해당 값의 곱은 '1764'입니다.

예시 4:

이 인스턴스에서는 'GreetingFunctorClass'가 생성됩니다. 그런 다음 'public' 생성자를 삽입하고 이 'public' 생성자에서 'operator()' 함수를 재정의합니다. 우리는 “안녕하세요! 저는 'operator()' 함수 아래에 'cout'을 배치한 후 여기에서 C++ 프로그래머입니다.

이제부터는 'main()'을 호출합니다. 여기서는 'GreetingFunctorClass'의 개체로 'g_functor'를 생성한 다음 이 'g_functor' 개체를 'g_functor()' 함수로 호출합니다. 이는 “operator()” 함수를 재정의하면서 추가한 결과를 제공합니다.

코드 4:

#include
사용하여 네임스페이스 성병 ;
사용하여 네임스페이스 성병 ;
수업 GreetingFunctorClass {
공공의 :
무효의 운영자 ( ) ( ) {
시합 << '안녕하세요! 저는 C++ 프로그래머입니다.' ;
}
} ;
정수 기본 ( ) {
GreetingFunctor클래스 g_functor ;
g_함수 ( ) ;
반품 0 ;
}

산출:

여기서는 코드에서 “operator()” 함수를 재정의할 때 추가한 문이 클래스 객체를 함수처럼 호출할 때 여기에 표시되는 것을 알 수 있습니다.

예시 5:

이번에는 필요한 모든 함수 선언이 포함된 'bits/stdc++.h'가 포함되었습니다. 그런 다음 'std' 네임스페이스가 여기에 배치됩니다. 여기서 만드는 클래스는 'incrementFunctor' 클래스입니다. 그런 다음 'private' 생성자를 만들고 'int' 데이터 유형으로 'int_num' 변수를 초기화합니다.

이 'public' 생성자 아래에 'incrementFunctor'를 배치하고 그 안에 'int n1'을 전달합니다. 그런 다음 ':'을 배치한 후 'int_num(n1)'을 입력합니다. 그런 다음 'int' 데이터 유형의 'operator()' 함수인 함수를 재정의하고 여기서 'int arrOfNum'을 선언합니다. 그런 다음 'return'을 사용하고 'int_num + arrOfNum'을 삽입합니다. 이제 'arrOfNum' 값이 증가하고 'int_num' 값이 추가되어 여기에 반환됩니다.

'main()'을 호출한 후 'arrOfNum'을 초기화하고 여기에 다른 정수 값을 할당합니다. 그런 다음 'sizeof(arrOfNum)/sizeof(arrOfNum[0])'와 같은 'sizeof' 함수를 추가하는 'n1' 변수가 초기화됩니다. 그 후 'additionNumber'는 '3'으로 초기화됩니다. 이제 'transform()' 함수를 활용하겠습니다. 이 'transform()'은 'increamentFunctor' 클래스의 객체를 생성한 후 해당 객체를 호출하는 것과 같습니다. 그런 다음 'for' 루프를 사용한 다음 'arrOfNum[i]'를 'cout'합니다.

코드 5:

#include
사용하여 네임스페이스 성병 ;
수업 incrementFunctor
{
사적인 :
정수 정수_번호 ;
공공의 :
incrementFunctor ( 정수 n1 ) : 정수_번호 ( n1 ) { }
정수 운영자 ( ) ( 정수 arrOfNum ) const {
반품 정수_번호 + arrOfNum ;
}
} ;
정수 기본 ( )
{
정수 arrOfNum [ ] = { 6 , , 2 , 1 , 9 , 0 , 8 } ;
정수 n1 = 크기 ( arrOfNum ) / 크기 ( arrOfNum [ 0 ] ) ;
정수 추가 번호 = ;
변환 ( arrOfNum, arrOfNum + n1, arrOfNum, incrementFunctor ( 추가 번호 ) ) ;

~을 위한 ( 정수 = 0 ; < n1 ; ++ )
시합 << arrOfNum [ ] << ' ' ;
}

산출:

여기에는 'incrementFunctor'가 함수로 활용되는 'Functor'인 코드의 결과가 표시됩니다.

예시 6:

이 코드에서는 미리 정의된 '더 큰' 기능자를 활용합니다. 여기에는 코드에 필요한 함수나 메서드가 선언되어 있으므로 코드에 필요한 4개의 서로 다른 헤더 파일을 포함합니다. 그런 다음 'std'를 추가하고 'main()'을 호출한 후 'myIntegerVector' 벡터를 초기화합니다. 이 벡터에 정렬되지 않은 값을 삽입합니다. 아래에서는 '정렬' 기능을 적용하여 이러한 벡터 값을 정렬합니다.

이 기능을 활용하면 값이 오름차순으로 정렬됩니다. 그러나 여기서는 내림차순 정렬 결과를 제공하는 C++의 미리 정의된 함수인 'greater'를 활용합니다. 그런 다음 'for' 루프와 'cout'을 사용하여 정렬된 값을 표시합니다.

코드 6:

#include
#include <알고리즘>
#include <벡터>
#include <기능적>
사용하여 네임스페이스 성병 ;

정수 기본 ( ) {
벡터 < 정수 > myInteger벡터 = { 13 , 이십 일 , 19 , 44 , 32 , 42 , 9 , 6 } ;
종류 ( myIntegerVector. 시작하다 ( ) , myIntegerVector. ( ) , 보다 큰 < 정수 > ( ) ) ;
~을 위한 ( 정수 vec_num : myInteger벡터 ) {
시합 << vec_num << '' ;
}
반품 0 ;
}

산출:

벡터의 모든 값은 '더 큰' 기능자인 C++의 사전 정의된 기능을 사용하여 내림차순으로 정렬되며 해당 정의는 '기능적' 헤더 파일에서 사용할 수 있습니다.

결론

이 기사에서는 '펑터 C++'의 개념을 깊이 탐구합니다. 우리는 객체가 'operator()'라는 함수를 오버로드하는 함수로 호출될 수 있다는 것을 연구했습니다. 이것은 펑터로 알려져 있습니다. “operator()”의 오버로딩이 의도한 대로 활용되려면 공용 액세스가 제공되어야 합니다. 우리는 코드에서 '펑터'와 미리 정의된 '펑터'를 활용한 다양한 예를 설명했습니다.