3. [C++] 매개변수의 디폴트 값(Default Value)

2024. 4. 11. 11:47[C++]/C++ 언어 기초

🍃 매개변수에 설정하는 디폴트 값

디폴트 값 = 기본적으로 설정되어 있는 값
int MyFuncOne(int num=7) {
	return num+1;
}

int MyFuncTwo(int num1=5, int num2=7) {
	return num1+num2;
}
  • 이 코드에서 매개변수의 선언은 int num=7이라 되어있다.
  • 이는 함수 호출 시 "인자를 전달하지 않으면 기본적으로 7이 전달된 것으로 간주하겠다"라는 의미이다.
MyFuncOne();
MyFuncOne(7);


MyFuncTwo();
MyFuncTwo(5, 7);
  • 따라서 이와 같이 호출하면 같은 값이 반환된다.

DefaultValue1.cpp

#include <iostream>

int Adder(int num1=1, int num2=2) {
    return num1+num2;
}

int main(void) {
    std::cout<<Adder()<<std::endl;
    std::cout<<Adder(5)<<std::endl;
    std::cout<<Adder(3, 5)<<std::endl;
    return 0;
}
3
7
8
  • 매개변수에 디폴트 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자 전달이 가능하다.
  • 전달되는 인자는 왼쪽에서부터 채워져 나가고, 부족분은 디폴트 값으로 채워진다.

 

디폴트 값은 함수의 선언 부분에만 표현하면 된다.

DefaultValue2.cpp

#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;
}

🍃 부분적 디폴트 값 설정

int YourFunc(int num1, int num2, int num3=30) {. . .}
int YourFunc(int num1, int num2=20, int num3=30) {. . .}
int YourFunc(int num1=10, int num2=20, int num3=30) {. . .}
  • 디폴트 값을 일부분만 지정할 수 있다.
  • 하지만 오른쪽 매개변수의 디폴트 값을 비우는 형태로는 절대 지정할 수 없다.
  • 반드시 오른쪽 매개변수의 디폴트 값부터 채우는 형태로 정의 해야 한다.
int YourFunc(int num1=10, int num2, int num3) {. . .}
int YourFunc(int num1=10, int num2=20, int num3) {. . .}
  • 위 예제와 같이 지정할 수는 없다.
  • "함수에 전달되는 인자가 왼쪽에서부터 오른쪽으로 채워지기 때문이다."

DefaultValue3.cpp

#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<<"[5, D, D] : "<<BoxVolume(5)<<std::endl;
    //std::cout<<"[D, D, D] : "<<BoxVolume()<<std::endl;
    return 0;
}

int BoxVolume (int length, int width, int height) {
    return length*width*height;
}
[3, 3, 3] : 27
[5, 5, D] : 25
[5, D, D] : 5

 


문제 풀이

 

문제1 

예제 DefaultValue3.cpp 에 정의된 함수 BoxVolume을 '매개변수의 디폴트 값 지정' 형태가 아닌, '함수 오버로딩'의 형태로 재 구현해보자. 물론 main 함수는 변경되지 않아야하며, 실행 결과도 동일해야한다.

 

내 풀이

#include "stdafx.h"
#include <iostream>

using namespace System;

//int BoxVolume(int length, int width = 1, int height=1);

int BoxVolume(int length, int width, int height){
   return length*width*height;
}

int BoxVolume(int length, int width){
   return length*width*1;
}

int BoxVolume(int length){
   return length*1*1;
}


int main(array<System::String ^> ^args)
{
   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;
}

 

 

문제2

다음과 같은 형태로의 함수 오버로딩은 문제가 있다. 어떠한 문제가 있는지 설명해보자

int SimpleFunc(int a=10)
{
	return a+1;
}

int SimpleFunc(void)
{
	return 10;
}

 

내 풀이

  • 만약 SimpleFunc()로 인자에 빈 값을 넣어 호출하게 되면 두 함수 모두 호출이 가능하기 때문에, 에러가 발생합니다.
반응형