728x90
728x90
디폴트값은 기본적으로 설정되어 있는 값
C++의 특성, 디폴트 매개 변수
디폴트 매개 변수는 전달되지 않은 인자 대신으로 들어갈 변수 기본 값
전달된 인자가 없을 때 대입
#include <iostream>
int function(int a=0){
return a+1;
}
// void의 경우 return값이 없어 컴파일 오류 발생
// void function(int a=0){
// //return a+1;
// }
int main(void)
{
std::cout<<function(11)<<std::endl;
//모니터로 이 데이터를 보낸다(출력)
// return되는 결과값을 보낸다.
// return 타입이 void면 안된다.
std::cout<<function()<<std::endl;
return 0;
}
디폴트 값은 함수의 선언 부분에만 표현하면 된다.
함수 원형을 별도로 선언하는 경우 매개변수의 디폴트값은 선언 부분에만 위치한다.
#include <iostream>
int Adder(int num1=1, int num2=2); //함수 선언
int main(void)
{
std::cout<<Adder()<<std::endl;
std::cout<<Adder(5)<<std::endl;
std::cout<<Adder(3, 5)<<std::endl;
return 0;
}
int Adder(int num1, int num2) { // 함수 정의
return num1+num2;
}
부분적 디폴트 값 설정
부분적 값 설정도 가능한데 오른쪽 매개변수의 디폴트값을 비우는 형태는 불가하다.
오른쪽 매개변수의 디폴트 값부터 채우는 형태로 정의한다.
이유 : 함수에 전달되는 인자가 왼쪽부터 오른쪽으로 채워지기 때문
#include <iostream>
int BoxVolume(int length, int width=1, int height=1);
// 매개변수가 채워지는 방향은 왼쪽에서 오른쪽
int main()
{
std::cout<<"[3,3,3] : "<<BoxVolume(3,3,3)<<std::endl;
std::cout<<"[5,5,1] : "<<BoxVolume(5,5)<<std::endl;
std::cout<<"[7,def,def] : "<<BoxVolume(7)<<std::endl;
return 0;
}
int BoxVolume(int length, int width, int height){
return length*width*height;
}
// 분리할 경우 함수 선언부에만 디폴트 매개변수를 정의한다.
// 정의부에도 중복되면 컴파일 에러 발생
문제 01-3-1 : 아래 코드에서 정의된 함수 BoxVolume을 매개변수의 디폴트 값 지정 형태 말고 함수 오버로딩 형태로 재구현해보자. main 함수는 수정하지 않고, 결과가 동일하게 해야 한다.
#include <iostream>
int BoxVolume(int length, int width=1, int height=1);
int main(void)
{
std::cout<<"[3,3,3] : "<<BoxVolume(3,3,3)<<std::endl;
std::cout<<"[5,5,D] : "<<BoxVolume(5,5)<<std::endl;
std::cout<<"[7,D,D] : "<<BoxVolume(7)<<std::endl;
//std::cout<<"[D,D,D] : "<<BoxVolume()<<std::endl;
// 모든 매개변수에 디폴트 값이 없어 인자가 전달되지 않으면 컴파일 에러 발생
return 0;
}
int BoxVolume(int length, int width, int height){
return length*width*height;
}
오버로딩 형태로 재구현
#include <iostream>
int BoxVolume(int length, int width, int height){
return length*width*height;
}
int BoxVolume(int length, int width){
int height = 1;
return length*width*height;
}
int BoxVolume(int length){
int width = 1;
int height = 1;
return length*width*height;
}
int BoxVolume(){
int length = 1;
int width = 1;
int height = 1;
return length*width*height;
}
int main(void)
{
std::cout<<"[3,3,3] : "<<BoxVolume(3,3,3)<<std::endl;
std::cout<<"[5,5,D] : "<<BoxVolume(5,5)<<std::endl;
std::cout<<"[7,D,D] : "<<BoxVolume(7)<<std::endl;
std::cout<<"[D,D,D] : "<<BoxVolume()<<std::endl;
return 0;
}
문제 01-3-2 : 다음과 같은 형태의 함수 오버로딩은 문제가 있다.
#include <iostream>
int function(int a=10) {
return a+1;
}
int function(void) {
return 10;
}
int main(void)
{
std::cout<<function(10)<<std::endl;
// 아래는 둘 다 호출이 가능하여 컴파일 에러 발생
// std::cout<<function()<<std::endl;
return 0;
}
디폴트 매개변수와 함수 오버로딩이 둘 다 있을 때 발생되는 문제
인자값이 없는 함수를 호출하면 : 컴파일 오류 발생 (둘 다 호출 가능해서)
따라서 함수를 구분하여 사용할 것.
728x90
728x90
'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글
02-1 챕터 02의 시작에 앞서 (0) | 2021.08.19 |
---|---|
01-5 이름공간 (0) | 2021.08.19 |
01-4 인라인 함수 (0) | 2021.08.18 |
01-2 함수 오버로딩 (0) | 2021.08.18 |
[윤성우 열혈 c++] 01-1 printf, scanf를 대신하는 입출력 (0) | 2021.08.17 |