2010-06-17 3 views
1

나는이 같은 클래스에 문제가 있어요에서 함수 프로토 타입에 : 나는 그 클래스가있는 경우연산자 & 및 * 클래스

class Sprite { 
    ... 
     bool checkCollision(Sprite &spr); 
    ... 
}; 

그래서, 나는이 작업을 수행 할 수 있습니다

ball.checkCollision(bar1); 
나는이에 클래스 변경하는 경우

그러나 :

class Sprite { 
    ... 
     bool checkCollision(Sprite* spr); 
    ... 
}; 

을 나는이 작업을 수행해야한다 :

ball.checkCollision(&bar1); 

그래서 차이점은 무엇입니까 ?? 다른 대신에 더 좋은 방법일까요?

감사합니다.

+0

조금 더 일찍 게시 된 http://stackoverflow.com/questions/3063514/what-does-it-mean-to-pass-a-variable-to-a-function-e-g-string-insert-size를 참조하십시오. –

답변

4

당신은 실제로 명시 적 첫 번째 경우에, (당신이 값을 복사하지 않는) BAR1의 주소를 전달하는 (포인터를 명시 적으로 역 참조하여 명시 적으로 오브젝트의 포인터를 포인터 매개 변수로 전달해야 함) 암시 적으로 (참조를 조작 할 때 인 것처럼 인 경우) 객체 자체를 조작하여 값 구문을 가지므로 호출자의 코드는 & 연산자를 사용하여 명시 적으로 포인터를 전달하지 않습니다.

그래서 포인터와 참조의 큰 차이점은 포인터/참조 변수에서 할 수있는 것입니다. 포인터 변수 자체는 수정할 수 있으므로 포인터를 다른 것으로 가리키고 변경할 수 있으며, 감소하므로 포인터에 대한 액티비티 (변수 이름을 사용하여 직접 액세스하는 액티비티)와 해당 액티비티가 가리키는 객체 (액세서 ​​빌 러티로 액세스하는 액티비티)가 강하게 구분됩니다. 회원, -> 바로 가기).

참조는 참조하는 객체에 대한 별칭 일 뿐이며 참조 자체는 변경할 수 없습니다. 참조하는 객체로 초기화 한 다음 해당 동작을 수행합니다 그들의 평생을위한 대상.

일반적으로 C++에서 포인터는 내가 말한 동기와 C++ FAQ appropriate section에서 찾을 수있는 동기에 대해 선호합니다.

성능 측면에서 볼 때 실제로 참조는 변모의 포인터이기 때문에 동일해야합니다. 여전히 포인터가 가리키는 포인터 대신 참조를 사용할 때 컴파일러가 최적화 할 수있는 몇 가지 구석이있을 수 있습니다. 왜냐하면 참조가 숨겨진 주소를 변경하지 않도록 보장되기 때문입니다 (예 : 삶의 처음부터 끝까지 항상 동일한 객체를 가리킴), 어떤 이상한 경우에 일 수 있습니다.은 참조를 사용하여 성능이 향상되었지만 참조를 사용하는 시점은 성능이 아니라 프로그래밍 스타일과 가독성에 관한 것입니다.

+1

참조와 포인터는 동일한 의미를 갖지 않습니다. 예를 들어, 할당을 고려하십시오. –

+0

당신 말이 맞아요. 내 대답을 편집 할게. –

+0

감사합니다. 그래서 Sprite * spr을 사용합니다. 내가 더 명확하게 보게 하니까. – Puyover

1

참조는 null 일 수 없습니다. 포인터는 할 수 있습니다.

널 포인터를 함수에 전달하지 않으려면 참조를 사용하십시오.

+0

오케이, 그렇지 않으면 편도가 다른 것보다 빠릅니다. – Puyover

+0

포인터를 전달하고 강력한 코드를 작성하려면 null인지 확인해야합니다. 참조를 사용하는 경우 해당 확인을 할 필요가 없습니다. –

+2

@Puyover : 속도가 가장 염려되어야합니다. 언어 학습은 훨씬 더 중요합니다. – GManNickG

0

둘 다 (본질적으로) 동일한 작업을 수행합니다. 객체의 주소 만 복사되도록 참조로 함수에 객체를 전달합니다. 이는 효율적이며 함수가 객체를 변경할 수 있음을 의미합니다.

간단한 경우 당신은 그것들을 제공합니다.

주요 차이점은 참조가 null 일 수 없으므로 함수에서 null을 테스트 할 필요가 없지만 객체가없는 경우 null 객체를 전달할 수 없다는 것입니다.

호출 코드에서 전달하는 객체가 수정 될 수 있다는 것이 명확하지 않기 때문에 일부 사람들은 참조 버전별로 패스를 싫어하는 사람도 있습니다. 일부 코딩 표준에서는 함수에 대한 const 참조 만 전달하는 것이 좋습니다.

0

포인터를 사용하면 컴파일러에서 참조와 함께 개체의 주소를 전달하려고한다는 것을 알 수 있어야합니다. 컴파일러는 이미 ptr을 원한다는 것을 알고 있습니다. 두 가지 모두 맛있습니다. 나는 개인적으로 참고 문헌을 좋아하지 않습니다. 왜냐하면 내가하고있는 일을보고 싶어하기 때문입니다. 두 포인터 (스프라이트 *) 및 참조 (스프라이트 &)를 참조 의미를 갖고 있기 때문에 두 경우 모두

+2

C++에는 맛이없는 장소가 있습니다. 단지 참조 만하면됩니다. 예를 들어, 복사 생성자에 대한 매개 변수입니다. –