포인터와 참조의 구문과 일반적인 의미를 이해하지만 API에서 참조 또는 포인터를 사용하는 것이 적절한 지 어떻게 결정해야합니까?
당연히 일부 상황에는 하나 또는 다른 상황이 필요 operator++
하지만 (참조 인수가 필요) 일반적으로 변수가 파괴적으로 전달된다는 구문이 명확하기 때문에 포인터 (및 const 포인터)를 사용하는 것을 선호합니다.
예를 들어 다음 코드에서 :
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
포인터를 사용하면 항상 무슨 일이 일어나고 있는지 분명하므로 명확성이 큰 관심사 인 API 등은 참조보다 포인터가 적절하지 않은가? 이것이 참조가 필요할 때만 사용해야한다는 것을 의미합니까 (예 :) operator++
? 하나 또는 다른 성능 문제가 있습니까?
수정 된 날짜 :
NULL 값을 허용하고 원시 배열을 처리하는 것 외에도 선택은 개인 취향에 달려 있습니다. Google의 C ++ 스타일 가이드 를 참조하는 아래의 답변을 수락 했습니다. "참조는 값 구문이 있지만 포인터 의미가 있기 때문에 혼동 될 수 있습니다."라는 견해를 제시합니다.
NULL이 아니어야하는 포인터 인수를 삭제하는 데 추가 작업이 필요하기 때문에 (예 : add_one(0)
포인터 버전을 호출하고 런타임 중에 중단됨) 유지 보수성 관점에서 객체가 반드시 있어야하는 곳에 참조를 사용하는 것이 부끄러운 일입니다. 구문의 명확성을 잃습니다.
add_one(a);
것이 확실하지 않은 것은 무엇입니까 a
? 그것은 코드에서 바로 말합니다 : add one .
addOneTo(...)
. 그것이 당신이하고 싶은 것이 아닌 경우, 선언을보십시오.