본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 11. C++ default parameter 사용과 주의사항

by 신림83 2020. 10. 21.
반응형

CPP 초급 강좌 11. C++ default parameter 사용과 주의사항

default parameter 디폴트 파라매타라고 부른다.

 함수 호출 시 인자를 전달하지 않으면 미리 지정된 인자 값을 사용하도록 하는 문법

 

학원에서 학생 등록을 한다고 하자. 이름과 전화번호를 등록하길 원하는데, 등록하지 않길 원하는 학생은 등록을 하지 않아도 된다고 가정하다.

#include <iostream>
#include <string>
using namespace std;

void add(string name, string number)
{
	//~~ 구현 구현
}

int main()
{
	add("개똥이", "123123");
	add("말똥이", "123123");
	add("소똥이", "123123");
}

add란 함수에 인자로 이름과 전번을 넣게 함이 의도이다. 그런데 사실 말똥이와 소똥이는 전화번호를 등록하고 싶지 않았다. 요즘 그런 거 있잖은가 개인정보를 보호해야지, 그런데 이런 요구가 점점 많아지고 있다.

 

그럼..

int main()
{
	add("개똥이", "123123");
	add("말똥이", "");
	add("소똥이", "");
}

이런 식으로 전번을 안 넣을 수 있겠지,

 

요걸 디폴트 파라매타를 사용해서 좀 고쳐보자.

void add(string name, string number = "")
{
	//~~ 구현 구현
}

int main()
{
	add("개똥이", "123123");
	add("말똥이", "");
	add("소똥이"); //a. 이름만 입력하면 자동으로 전화번호가 안들어 가게 구현
}

void add(string name, string number = "") 함수에서 number = "" 디폴트 파라매타 처리를 해두었다.

a. 에서 소똥이는 이름만 적어서 호출해주면 number은 자동으로 ""인식되어 입력된다.

 

디폴트 파라메타를 쓸 때 주의사항이 있다.

 

마지막 인자부터 디폴트 값을 지정해야 한다. 그렇게만 쓸 수 있다.

중간부터 설정하거나 중간을 빼먹거나로 사용할 수 없다. 아래와 같이 사용이 가능하다.

void f1(int p1, int p2, int p3) {}; //no use

void f2(int p1, int p2, int p3 = 0) {};
void f3(int p1, int p2 = 0, int p3 = 0) {};
void f4(int p1 = 0, int p2 = 0, int p3 = 0) {};

 

함수가 선언부와 구현부가 나눠질 때는 선언부에 디폴트 파라매타를 써야 한다.

void f1(int p1, int p2, int p3 = 0); //함수 선언

int main()
{
	f1(0, 0);
}

void f1(int p1, int p2, int p3) //함수 구현
{ };

그럼 만약 구현부에 디폴트 파라매타가 있다면?

void f1(int p1, int p2, int p3); //함수 선언

int main()
{
	//f1(0, 0);
}

void f1(int p1, int p2, int p3 = 0) //함수 구현
{ };

위와 같이 코딩해보면 빌드가 문제없이 잘 된다.

 

하지만 f1(0.0); 함수를 호출하게 열어두고 빌드를 해보면 

빌드 실패

빌드되지 않는다. 이는 함수 호출 시도 문구를 컴파일러가 해석 시 먼저 해당 함수의 정의부를 살피기 때문이다. 정의부에는 디폴트파라매타가 없다. 무조건 3개의 인자를 넣어줘야 한다. 저런 코딩은 정상적인 동작을 기대할 수도 없고, 나중에 애러가 발생 시 찾기 쉽지 않을 것이다. 무조건 함수 정의 시에만 사용하자.

배우자! 그것이 답이다.

봐주셔서 감사합니다.

반응형

댓글