prototype 선언 type func(type var, … );
definition 정의 type func(type var, …) statement; *선언과 정의를 동시에 하려면 main 위에 한다(컴파일러가 알 수 있게)
Arguments 함수를 호출할 때 모든 인수를 채워넣지 않기 위해서는 default arg 사용 선언할 때에만 지정할 수 있다. int func(int a, int b, int c=4, int d=9); 호출: func(); →error (모든 인수를 defalut 지정해놓으면 가능하긴 함) func(1,2); →func(1,2,4,9); func(1,2,3); →func(1,2,3,9); func(1,2,3,4); →func(1,2,3,4); func(1,2, , 4); →error
inline functoins 함수를 호출하면 오래 걸린다! 호출 자체를 하지 않는다. #define func(x) ((x)*(x)) 단순히 치환할 뿐이다.
const const int *ptr: 값 수정 불가, ptr자체는 이동 가능(ptr++) int * const ptr : ptr 수정 불가, 값 자체는 수정 가능(ptr[1]++) const int * const ptr: 둘다 불가 →함수 인수에 넣어서 활용
function and array type func(int arr[])~ 이때의 arr은 &(arr[0])과 동일 →call by address 이러면 내부에서 조작하면 원본이 바뀐다.
function and structure **구조체는 함수의 인수로 들어갈 때 전부 복사된다→비효율 따라서 func( structname * var) 이렇게 사용, var→data로 접근
function pointer 함수의 주소를 사용할 수 있다.
장점: 함수 내에서 다른 함수를 사용하거나, 여러 함수를 깔끔하게 호출할 수 있게 한다.
Reference Variable 특징
사용 이유: 크기가 큰 구조체나 클래스를 함수로 넘길 때, 그냥 하면 통째로 복사하기 때문에 느려진다 → 참조 변수는 원본도 변경 가능하고, 참조가 바뀌지 않으며 널을 참조하지도 않기 때문에 유용하다.
function and reference variable void func(int &a){}, 호출시 func(var); ==void func(int * a){}, 호출시 func(&var);
const int & func(const int &a) return a; 이렇게 함수의 리턴값을 참조변수로 할 수도 있지만, 지역변수를 return하게 되면 에러가 발생한다! 참조가 있는(인수로 받아온) 변수를 리턴하여야 한다.
같은 입력에 대해서는 불가능 int func(int x); double func(int x); →error
입력이 애매하게 다르면 불가능 int func(int x); int func(int & x); → error
Function Templates 오버로딩을 더 멋지게 하는 방법
template <typename T, typename U =double > //기본으로 지정 가능
T func (T &a, U &b){ //여러개 가능
T var;
statement;
return var;
}
사용: func<int ,int >(x,y);
기본 인수 사용: func<int>(x,y) //func<int,double>(x,y)
*explicit specialization: 특정 타입에만 코드를 바꾸고 싶을 때 해당 타입의 typename 만 비우고 쓴다.
template <typename U>
char func(char &a, U &b){
char var;
other_statement;
return val;
}
사용: func<char, int>(x,y); //x가 char 일때 사용