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()로 인자에 빈 값을 넣어 호출하게 되면 두 함수 모두 호출이 가능하기 때문에, 에러가 발생합니다.
반응형
'[C++] > C++ 언어 기초' 카테고리의 다른 글
01-06 은행계좌프로그램 실습 1단계 (0) | 2024.04.11 |
---|---|
5. [C++] 이름공간(namespace) (0) | 2024.04.11 |
4. [C++] 인라인(inline) 함수 (0) | 2024.04.11 |
2. [C++] 함수 오버로딩 (0) | 2024.04.11 |
1. [C++] 프로젝트 세팅 및 입출력 (0) | 2024.04.08 |