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
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v