C++/기억하고 싶은 거

[C++] 함수의 매개변수에 참조자와 const

KANTAM 2023. 5. 31. 13:53

참조자를 사용해 복사 피하기

함수의 인자 전달에서 크기가 큰 클래스타입이나 컨테이너 객체를 복사하는 것은 비효율적일 수 있다. 게다가 일부 클래스 타입은 복사할 수 없다. 복사할 수 없는 타입인 객체와 연산하려면 함수에서는 참조자 매개변수를 사용해야 한다.

bool isShorter(const string &s1, const string &s2)
{
    return s1.size() < s2.size();
}

string의 길이를 비교하는 함수를 만들 때, string의 길이는 길 수 있기에 복사를 피하고 싶다면 매개변수를 참조자로 만든다.

가능하면 const에 대한 참조자를 사용한다.

함수에서 변경하지 않는 매개변수를 const가 아닌 보통의 참조자로 정의하면 좋지 못하다. 함수를 호출하는 쪽에서는 그 함수에서 인자 값을 변경할 것으로 오해할 수 있다. 게다가 const에 대한 참조자 대신 보통의 참조자를 사용하면 그 함수에 사용할 수 있는 인자의 타입을 심하게 제한하게 된다. 보통의 참조자 매개변수에는 const 객체나 상수, 변환을 해야 하는 객체를 전달할 수 없다.

bool isShorter(string &s1, string &s2)
{
    return s1.size() < s2.size();
}

예를 들어, 위의 두 string을 비교하는 함수에서 매개변수를 보통의 string&로 정의했을 때를 보자.

isShorter("abcd", "abcdefg");

위 처럼 호출하면 컴파일을 실패한다. 보통의 참조자는 const 객체나 상수와 결합할 수 없기 때문이다.

 

또한, 매개변수를 const에 대한 참조자로 정의한 다른 함수에서 이런 함수를 사용할 수 없다.

bool tempFunc(const string& str1)
{
    string str2 = "abcd";
    isShorter(str1, str2);
}

여기서도 isShorter을 호출하면 컴파일을 실패한다. str1const string에 대한 참조자이지만 isShorters1은 보통의 string에 대한 참조자이기 때문이다.