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


112

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

답변:


148

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

a->b

(*a).b

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


9
과부하 문제는 생각보다 훨씬 덜 드뭅니다. 얼마 전, STL의 구현은 더 과부하가 없었다 ->당신이 때문에 일부 반복자 유형에 대한 연산자를 가지고 사용 *.. 많은 라이브러리에서 일관성없이 정의합니다. 템플릿으로 작업하고 정확한 유형을 모르면 정말 짜증납니다.
Konrad Rudolph

1
a[0].b대신 할 수도 있습니다 (*a).b. 그러나 제대로 구성되지 않았습니다.
Sellorio

2
수년간의 C # 프로그래밍 끝에 C ++로 돌아가는 것은인지 적으로 부담이 될뿐만 아니라 C ++ 구문은보기 흉하고 엉뚱합니다. 사용 후 샤워를하고 싶어요. C 및 C ++로 작성된 프로그램은 잘못된 프로그래밍을 조장합니다. 유닉스 이전의 애플은 언어를 파스칼처럼 예쁘게 만들기 위해 고군분투했습니다.
ATL_DEV

@ATL_DEV 많은 추악한 것들이 더 이상 관용적이라고 생각하지 않는다고 주장하고 싶지만, 불행히도 C ++ 프로그래머로서 익숙하지 않다는 의미는 아닙니다. 또한 구문 적으로 좋은 경로는 종종 의미 적으로 좋은 경로가 아니지만 나쁘지 않고 나아지고 있습니다. 그러나 다시 C ++ Stockholm Syndrome이 있습니다.
Tim Seguine

@TimSeguine 예쁜 코드를보고 싶다면 Macintosh 내부에 대한 문서를 참조하십시오. 나는 그들이 CamelCase를 발명했다고 생각합니다. 매우 설명적인 변수 이름과 우아한 형식의 코드. 그들은 나중의 C 코드를 이전의 파스칼 코드만큼 멋지게 만들 수있었습니다.
ATL_DEV

70

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

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


1
으로 binding strength당신은 연산자 우선 순위를 의미? 그렇지 않다면 둘의 차이점은 무엇입니까?
vishnuprasanth 2010

1
@Vizkrig 예, 두 용어는 같은 의미로 사용됩니다 (적어도 최근에는 "연산자 우선 순위"가 훨씬 더 자주 사용되는 것 같습니다).
Konrad Rudolph

45

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

예를 들면 :

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

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

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

(*aPointer).method();

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

aPointer->method();

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

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

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


8
new SomeClass()객체가 SomeClass *아닌 포인터 ( )를 반환 SomeClass합니다. 그리고 당신은 선언으로 시작 anObject하고 aPointer있지만, 사용중인 p이후.
musiphil 2012

전반적으로이 설명은 이론적으로 매우 적절하며, 대상의 변화 만이 약간 복잡하게 만듭니다. 그러나 프로세스는 더 잘 설명되어 있습니다
Code Man

17

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

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

1
기술적으로 더 이상 거기에서 "연산자"가 아닙니다.
Martin Ba

6
@Martin 대부분의 사람들은 값을 계산하는 데 직접 사용되지 않는 많은 것들에 "연산자"라는 단어를 사용합니다. "::"( "범위 연산자")와 유사합니다. 나는 이것에 대한 표준의 관점이 정확히 무엇인지 모릅니다. 추상적 인 의미에서 "->"도 "->"로 쓰여진 haskell 연산자와 같이 반환 유형에 일련의 유형 (매개 변수)을 매핑하는 기능적 연산자로 볼 수 있습니다.
Johannes Schaub-litb

6
항복한다! :-P
Martin Ba

2
@ JohannesSchaub-litb : ::실제로 .또는 같은 연산자이며 ->표준에서는 "범위 확인 연산자"라고합니다.
musiphil

13

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

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

된다 :

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


1

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

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

int* prt = &intVar;

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

(*ptr).foo();

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

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

ptr->foo();

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

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

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

0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.