함수를 호출한 대상한테 값을 반환하며 함수를 종료한다.
(참고 : 리턴형이 void 가 아닐경우 리턴문을 써줘야 한다)
#include <iostream>
using namespace std;
int fun()
{
return 5;
}
int fun1()
{
return 10;
}
void add()
{
cout<<fun1()<<endl; // fun1 는 함수를 호출한 대상인 add 함수에게 리턴값 10을 반환한다.
// 즉 fun1() = 10 으로 치환되는 셈이다.
}
int main()
{
add(); // cout<<add(); 컴파일오류 발생 리턴이 존재하지 않으므로 cout으로 출력할 수 없기 때문이다.
cout<<fun()<<endl; // fun 는 함수를 호출한 대상인 main 함수에게 리턴값 5를 반환한다.
return 0; // main 함수는 함수를 호출한 대상인 컴퓨터에게 리턴값 0을 반환한다.
}
실행결과 :
10
5
(추가 : 재귀함수
return 문에 자신을 호출하는 함수
ex) int add()
{
return add();
}
)
함수의 선언과 정의 :
선언과 동시에 정의 :
void exfunction() // 선언과 동시에 정의
{
}
선언과 정의 분리 :
void exfunction(); // 선언
void exfunction() // 정의
{
}
선언과 정의를 분리하는 이유 :
코드의 가독성을 높이기 위해
함수 실행과정 :
fun(); (호출) -> int fun(); (선언부분) -> 함수정의로 이동 -> 함수실행 -> return 문 -> 함수호출 부분으로 되돌아옴
#include <iostream>
using namespace std;
int fun(int a);
void main()
{
cout<<fun(5)<<endl;
}
int fun(int a)
{
a++;
return a;
}
실행흐름 :
main() 함수 -> fun(5) -> fun 선언 찾음 -> fun 정의 찾음 -> int a = 5; -> a++; -> fun(5)=6 -> 6 출력
함수 오버로딩(overloading) : (C++ 확장문법)
이름이 같으나 매개 변수의 타입이나 개수가 다른 함수들의 정의를 허용하며 사용하는것
#include <iostream>
using namespace std;
void fun(int num1, int num2)
{
cout<<num1<<" , "<<num2<<endl;
}
void fun(char str)
{
cout<<str<<endl;
}
void fun(void);
void main()
{
fun(); // 매개변수를 넣지 않았으므로 void fun(void) 가 호출된다.
fun('a'); // 매개변수를 char 형으로 하나 넣었으므로 void fun(char str) 가 호출된다.
fun(1, 2); // 매개변수를 int 형으로 두개 넣었으므로 void fun(int num1, int num2) 가 호출된다.
}