developer tip

화살표 연산자`->`대신 무엇을 사용할 수 있습니까?

copycodes 2020. 8. 14. 07:54
반응형

화살표 연산자`->`대신 무엇을 사용할 수 있습니까?


화살표 연산자 ( ->)의 동의어는 무엇입니까?


다음 두 표현식은 동일합니다.

a->b

(*a).b

(Konrad가 언급했듯이 연산자 오버로딩에 따라 다르지만 이는 드문 경우입니다).


a->b일반적으로 (*a).b. 여기서 괄호는 연산자의 바인딩 강도 때문에 필요 *하며 .: 바인딩이 더 강하고 먼저 실행 *a.b되기 때문에 작동하지 않습니다 .. 따라서 이것은 *(a.b).

그러나 과부하에주의하십시오. ->둘 다 *과부하 될 수 있으므로 그 의미는 크게 다를 수 있습니다.


C ++ 언어는 ->포인터를 역 참조하는 동의어로 화살표 연산자 ( )를 정의한 다음 .해당 주소 에서 -operator 를 사용합니다 .

예를 들면 :

객체 anObject, 및 포인터가있는 경우 aPointer:

SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;

객체 메서드 중 하나를 사용하려면 포인터를 역 참조하고 해당 주소에 대한 메서드 호출을 수행합니다.

(*aPointer).method();

화살표 연산자로 작성할 수 있습니다.

aPointer->method();

화살표 연산자가 존재하는 주된 이유는 매우 일반적인 작업의 입력을 단축하고 포인터 역 참조를 둘러싼 괄호를 잊기 쉽습니다. 괄호를 잊은 경우 .-operator는 * -operator보다 더 강력하게 바인딩하고 예제를 다음과 같이 실행합니다.

*(aPointer.method()); // Not our intention!

다른 답변 중 일부는 C ++ 연산자가 오버로드 될 수 있으며 일반적이지 않다는 것을 모두 언급했습니다.


C ++ 0x에서 연산자는 함수 또는 람다 식의 반환 유형을 나타내는 두 번째 의미를 얻습니다.

auto f() -> int; // "->" means "returns ..."

나는 대부분 그것을 오른쪽에서 왼쪽으로 읽고 "in"이라고 부른다.

foo->bar->baz = qux->croak

된다 :

"foo에있는 bar의 baz가 qux에서 삐걱 거리는 소리가됩니다."


-> 포인터가있는 데이터에 액세스 할 때 사용됩니다.

예를 들어 다음과 같이 int intVar 유형의 변수에 대한 포인터 ptr을 만들 수 있습니다.

int* prt = &intVar;

그런 다음 해당 포인터를 역 참조하여 해당 변수의 메모리 위치에 대한 숫자 값 대신 포인터가 가리키는 변수에 대한 함수를 호출하기 위해 foo와 같은 함수를 사용할 수 있습니다.

(*ptr).foo();

여기에 괄호가 없으면 컴파일러는 *(ptr.foo())우리가 원하는 것이 아닌 연산자 우선 순위 인해 이것을 이해할 것 입니다.

이것은 실제로 타이핑과 동일합니다.

ptr->foo();

현상태대로 ->역 참조하는 포인터 및 통화 기능 때문에 foo()포인터가 우리를 가리키는 변수에.

마찬가지로 ->클래스 멤버에 액세스하거나 설정하는 데 사용할 수 있습니다 .

myClass* ptr = &myClassMember;
ptr->myClassVar = 2; 

->를 사용하여 함수를 정의 할 수 있습니다.

auto fun() -> int
{
return 100;
}

람다가 아닙니다. 정말 기능입니다. "->"는 함수의 반환 유형을 나타냅니다.

참고 URL : https://stackoverflow.com/questions/221346/what-can-i-use-instead-of-the-arrow-operator

반응형