2009-07-04 5 views
9

가능한 중복 :
Difference between pointer variable and reference variable in C++C++ * 대 및 함수 선언에서

때 나는 전달 된 참조에 의한 개체에 대 포인터로 내 변수를 선언해야합니까? 그것들은 어셈블리에서 같은 것을 컴파일합니다 (적어도 런 타임 asymptotically). 그래서 언제 사용해야합니까?

void foo(obj* param) 
void foo(obj& param) 
+2

많은 사람들 중 많은 사람들 사이에서 http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c 중복 –

답변

12

내 규칙은 간단합니다 : 사용 * 당신이 규칙에서 제외 0

을 할 수있다, 따라서 그 값은 선택 표시 할 때 : 모든 _obj_s은 약 용기에 보관하고, 당신이 돈 '대신 foo(value); 대신 코드를 추악하게 보이게 만들고 그 값을 0으로 설정할 수 없으므로 assert(value);을 함수 begin에 입력하십시오.

3

포인터를 사용하는 한 가지 이유는 NULL 값을 함수에 전달하는 것이 좋습니다. 포인터를 사용하면이 작업을 수행 할 수 있습니다. 참고로이 작업을 수행 할 수 없습니다.

(단, 당신은 호출 된 함수는이 경우 충돌이 발생할 수 있음을 예상 할 수는 기준 매개 변수에 NULL을 전달하는 데 여전히 가능 까다로운 일을 수행하여..)

또 다른 규칙은 당신이를 통과하는 경우이다 포인터를 함수로 삽입하면 함수는 포인터를 사용하여 객체의 소유권을 가져올 수 있습니다 (특히 COM과 유사한 참조 계산 환경에서). 참조를 전달하면 호출 된 함수는 함수 호출 기간 동안 객체를 사용할 수 있지만 나중에 사용할 객체에 대한 포인터는 유지하지 않을 수 있습니다.

6

나는 그것이 나에게 가장 합리적이기 때문에 Google style guide standard을 따른다. 그것은 상태 : 함수 매개 변수 내에서

모든 참조가 const를해야 나열

void Foo(const string &in, string *out); 
는 구글 코드에서 매우 강력한 규칙 인 사실

그 값이나 const를 참조입니다 입력 인수 동안 출력 인수는 포인터입니다. 입력 매개 변수는 const 포인터 일 수 있지만 매개 변수는 비 const 참조 매개 변수를 절대 허용하지 않습니다. 당신이 인수가 복사되지 않습니다 것을 강조하고 싶습니다 경우 입력 매개 변수가 가리키는 const 포인터로 할 수 있습니다

한 경우는, 그래서 는 개체의 수명을 위해 존재해야합니다; 이 내용은 보통 주석에 문서화하는 것이 가장 좋습니다. bind2nd 및 mem_fun과 같은 STL 어댑터는 참조 매개 변수를 허용하지 않으므로이 경우 매개 변수는 매개 변수로 함수를 선언해야합니다.

+1

나는이 점에 동의하지 않습니다. 이것은 언어에서 참조/포인터 개념의 오용입니다. 참조는 컴파일 타임에 값이 초기화되도록하는 것입니다. 이것은 함수가 초기화 된 값만 받아들이는 매우 강력한 계약입니다. Java 또는 C#과 같은 언어는 부족하므로 전달되는 값이 NULL (null)인지 아닌지를 개발자가 확인해야합니다. 계약서에서 const 값만 받아 들일 수있는 권한이 있다는 것을 알지 못합니다. – ovanes

1

포인터와 참조의 다른 점은 생성자에 전달하지 않으면 참조를 유지하지 않는다는 것입니다. 포인터를 전달한다는 것은 복합 패턴 객체처럼 잠시 동안 객체가 객체를 고정시킬 수 있음을 의미 할 수 있습니다.

0

내 C++ 응용 프로그램에서 포인터를 사용하고 참조를 사용하지 않는 좋은 이유는 가독성입니다. 포인터를 사용할 때 실제로 일어나고있는 것을보고, 포인터를 사용할 때 구문은 실제로 일어나고있는 것을 알려줍니다.

"0"또는 "NULL"과 동일합니다. 내가 somevar_1int (또는 float)과 somevar_2 포인터의 일종 것을 알고

somevar_1 = 0; 
somevar_2 = NULL; 

: 나는처럼 보이는 코드를 볼 때 3 개월 후,이 방법을 "NULL"을 사용하여 선호.

관련 문제