[모던C++입문] 1.5 함수
- 📕 Book/모던C++입문
- 2021. 7. 3.
1.5 함수
인수
값에 의한 호출 (call by value)
void increment(int x)
{
x++
}
void main()
{
int i = 4;
increment(i); //i를 증가 시키지 않음
cout << "i is " << i << endl;
}
래퍼런스에 의한 호출 (pass by reference)
void increment(int& x)
{
x++;
}
increment(i+9); //오류 임시변수는 참조 불가
double two_norm(const vector& v) {...} //상수 레퍼런스
- 값으로 전달하는 인수들은 복사본으로 동작하기에 함수안에서 변경 가능
- const 레퍼런스는 할당의 좌변에 나타나거나 const가 아닌 레퍼런스로는 전달 불가
기본값
double root(double x, int degree = 2) { ... }
x = root(3.5, 3);
y = root(7.0); //root(7.0, 2) 와 동일
- 인수목록의 끝에서만 여러 개의 기본값 선언 가능
결과 반환
아무것도 반환하지 않기
- void는 실제 타입이 아니라 값 반환을 생략할 수 있는 자리표시자(placeholder)
- void함수는 인수가 없는 return을 통해 함수를 일찍 종료 가능
void print_x(int x)
{
std::cout << "The value x is " << x << std::endl;
}
void nothing; //void 개체를 정의할수 없음 ('void' 형식을 잘못 사용했습니다.)
void Heavy_compute(int x, int y)
{
for( ... )
{
if( ... )
return;
}
}
인라인
- 함수를 호출하는데 드는 비용이 많이 듬
- 인라인은 컴파일러가 함수에 포함된 연산을 호출을 대체하도록 함
inline double square(double x) { return x * x; }
오버로딩 (function overloading)
- 매개변수 선언이 다르면 같은 함수이름을 공유할 수 있다
int divide(int a, int b)
{
return a / b;
}
float divide(float a, float b)
{
return std::floor(a / b);
}
int main()
{
int x = 5, y = 2;
float n = 5.0, m = 2.0;
cout << divide(x, y) << endl;
cout << divide(n, m) << endl;
cout << divide(x, m) << endl; //빌드 오류 : 모호하다
}
- 인수 타입과 정확히 일치하는 함수가 있는가?
- 변환후 일치하는 함수가 있는가
- 0개 : 오류, 일치하는 함수를 찾을수 없다
- 1개 : 해당 함수를 호출
- 1개 이상 : 오류, 모호한 호출
- 함수의 오버로는 시그니처(signature)가 서로 달라야 한다
- 함수 이름
- 항(Arity)이라고 하는 인자의 개수
- 인자의 타입 (순서대로)
void foo(int x) {}
void foo(int y) {} //오류: 인수 이름만 다르다
long foo(int x) {} //오류: 반환 타입만 다르다
void f(int x) {}
void f(int& x) {}
void f(const int& x) {}
int main()
{
int i = 3;
const int ci = 4;
f(3);
f(i);
f(ci);
//함수 호출이 모호 해진다
//f(int x)를 생략해야 정상 동작함
//f(3)과 f(ci)는 f(const int& x)로
//f(i)는 (f int& x)로 호출됨
}
main 함수
- main함수의 표준 시그니처는 2가지가 있다
int main()
int main(int argc, char* argv[]) //혹은
int main(int argc, char** argv[])
argc_argv_test.cpp
int main(int argc, char* argv[])
{
for(int i = 0; i < argc; ++i)
{
cout << argv[i] << endl;
}
}
//프로그램 호출 옵션 값
argc_argv_test first second third fourth
//출력 결과
argc_argv_test
first
second
third
fourth
- main함수는 return문을 생략하더라도 return 0;를 자동으로 삽입한다
반응형