답변:
다음 두 표현식은 동일합니다.
a->b
(*a).b
(Konrad가 언급했듯이 연산자 오버로딩에 따라 다르지만 이는 드문 경우입니다).
a[0].b대신 할 수도 있습니다 (*a).b. 그러나 제대로 구성되지 않았습니다.
a->b일반적으로 (*a).b. 여기서 괄호는 연산자의 바인딩 강도 때문에 필요 *하며 .: 바인딩이 더 강하고 먼저 실행 *a.b되기 때문에 작동하지 않습니다 .. 따라서 이것은 *(a.b).
그러나 과부하에주의하십시오. ->및 둘 다 *과부하 될 수 있으므로 그 의미는 크게 다를 수 있습니다.
binding strength당신은 연산자 우선 순위를 의미? 그렇지 않다면 둘의 차이점은 무엇입니까?
C ++ 언어는 ->포인터를 역 참조하는 동의어로 화살표 연산자 ( )를 정의한 다음 .해당 주소 에서 -operator 를 사용합니다 .
예를 들면 :
객체 anObject, 및 포인터가있는 경우 aPointer:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
객체 메소드 중 하나를 사용하려면 포인터를 역 참조하고 해당 주소에 대한 메소드 호출을 수행합니다.
(*aPointer).method();
화살표 연산자로 작성할 수 있습니다.
aPointer->method();
화살표 연산자가 존재하는 주된 이유는 매우 일반적인 작업의 입력을 단축하고 포인터 역 참조를 둘러싼 괄호를 잊기 쉽습니다. 괄호를 잊은 경우 .-operator는 * -operator보다 더 강력하게 바인딩하고 예제를 다음과 같이 실행합니다.
*(aPointer.method()); // Not our intention!
다른 답변 중 일부는 C ++ 연산자가 오버로드 될 수 있으며 일반적이지 않다는 것을 모두 언급했습니다.
new SomeClass()객체가 SomeClass *아닌 포인터 ( )를 반환 SomeClass합니다. 그리고 당신은 선언으로 시작 anObject하고 aPointer있지만, 사용중인 p이후.
C ++ 0x에서 연산자는 함수 또는 람다 식의 반환 유형을 나타내는 두 번째 의미를 얻습니다.
auto f() -> int; // "->" means "returns ..."
::실제로 .또는 같은 연산자이며 ->표준에서는 "범위 확인 연산자"라고합니다.
-> 포인터가있는 데이터에 액세스 할 때 사용됩니다.
예를 들어 다음과 같이 int intVar 유형의 변수에 대한 포인터 ptr을 만들 수 있습니다.
int* prt = &intVar;
그런 다음 해당 포인터를 역 참조하여 foo와 같은 함수를 사용하여 해당 변수의 메모리 위치의 숫자 값이 아닌 포인터가 가리키는 변수에 대한 함수를 호출 할 수 있습니다.
(*ptr).foo();
여기에 괄호가 없으면 컴파일러는 *(ptr.foo())우리가 원하는 것이 아닌 연산자 우선 순위 로 인해 이것을 이해할 것 입니다.
이것은 실제로 타이핑과 동일합니다.
ptr->foo();
현상태대로 ->역 참조하는 포인터 및 통화 기능 때문에 foo()포인터가 우리를 가리키는 변수에.
마찬가지로 ->클래스 멤버에 액세스하거나 설정하는 데 사용할 수 있습니다 .
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
->당신이 때문에 일부 반복자 유형에 대한 연산자를 가지고 사용*.. 많은 라이브러리에서 일관성없이 정의합니다. 템플릿으로 작업하고 정확한 유형을 모르면 정말 짜증납니다.