Programing

C ++에서 도트 (.) 연산자와->의 차이점은 무엇입니까?

lottogame 2020. 3. 16. 08:12
반응형

C ++에서 도트 (.) 연산자와->의 차이점은 무엇입니까? [복제]


이 질문에는 이미 답변이 있습니다.

C ++에서 도트 (.) 연산자와->의 차이점은 무엇입니까?


foo->bar()와 동일합니다 (*foo).bar().

위의 괄호는 *and .연산자 의 바인딩 강도로 인해 필요 합니다.

*foo.bar()Dot ( .) 연산자가 먼저 평가 되므로 작동하지 않습니다 ( 연산자 우선 순위 참조 )

도트 ( .) 연산자는 오버로드 될 수 없으며 화살표 ( ->) 연산자는 오버로드 될 수 있습니다.

도트 ( .) 연산자는 포인터에 적용 할 수 없습니다.

참고 : 화살표 연산자 란 - ++ C에 대한 동의어 (>)?


포인터의 경우, 우리는 단지 사용할 수 있습니다

*pointervariable.foo

그러나 .연산자가 연산자보다 우선 순위가 높 *으므로 .먼저 평가됩니다. 따라서 우리는 이것을 괄호로 묶어야합니다.

(*pointervariable).foo

그러나 ()를 항상 입력하는 것은 어렵 기 때문에 ->동일한 것을 말하는 바로 가기로 개발 되었습니다. 객체 또는 객체 참조 .의 속성에 액세스하는 경우 사용 포인터를 통해 객체의 속성에 액세스하는 경우->


도트 연산자는 오버로드 될 수없고 화살표 연산자는 오버로드 될 수 없습니다. 화살표 연산자는 일반적으로 포인터 (또는 스마트 포인터와 같이 포인터처럼 동작하는 객체)에 적용됩니다. 도트 연산자는 포인터에 적용 할 수 없습니다.

편집 포인터 화살표 연산자에 적용될 때 점 연산자를 pointee에 적용하는 것과 같습니다 (ptr-> field는 (* ptr) .field와 같습니다)


화살표 연산자는 먼저 포인터를 역 참조한다는 점을 제외하면 점과 같습니다. foo.bar()메소드를 호출 bar()객체 foo, foo->bar메소드를 호출하여 bar포인터가 가리키는 객체 foo.


.조작 부재는 직접 액세스된다.

object.Field

화살표는 포인터를 역 참조하므로 가리키는 객체 / 메모리에 액세스 할 수 있습니다.

pClass->Field

pSomething->someMember

에 해당

(*pSomething).someMember

목표. 도트는 객체에서 작동합니다. 화살표는 객체에 대한 포인터에서 작동합니다.

std::string str("foo");
std::string * pstr = new std::string("foo");

str.size ();
pstr->size ();

->포인터가있을 때 사용하십시오 . .구조 (클래스)가있을 때 사용하십시오 .

구조체에 속하는 속성을 가리 키려면 다음을 사용하십시오 ..

structure.attribute

포인터 사용으로 메모리를 참조하는 속성을 가리 키려면 다음을 사용하십시오 ->.

pointer->method;

또는 다음과 동일

(*pointer).method

-> 연산자는 operator [] 액세스와 같은 특정 용도로는 사용할 수 없습니다.

#include <vector>

int main()
{
   std::vector<int> iVec;
   iVec.push_back(42);
   std::vector<int>* iVecPtr = &iVec;

   //int i = iVecPtr->[0]; // Does not compile
   int i = (*iVecPtr)[0]; // Compiles.
}

볼 때마다 간단합니다.

 x->y

그것이 같은 것을 알고

 (*x).y

->는 단순히 포인터 역 참조를위한 구문 설탕입니다.

다른 사람들이 말했듯이 :

포인터-> 방법 ();

말하는 간단한 방법입니다.

(* 포인터) .method ();

더 많은 포인터 재미를 얻으려면 Binky와 그의 마법 참조 지팡이를 확인하십시오.

http://www.youtube.com/watch?v=UvoHwFvAvQE


. (점) 연산자는 일반적으로 클래스의 인스턴스 (또는 정적 필드 / 클래스의 메소드)에서 필드를 가져 오거나 메소드를 호출하는 데 사용됩니다.

p.myField, p.myMethod ()-클래스의 p 인스턴스

-> (화살표) 연산자는 클래스가 가리키는 컨텐츠에서 필드를 가져 오거나 메소드를 호출하는 데 사용됩니다.

p-> myField, p-> myMethod ()-p는 클래스를 가리 킵니다.


이 둘 사이의 가장 간단한 차이점은 "->"는 해당 객체 필드, 함수 등을보기 전에 "."을 가리 키기 전에 포인터를 역 참조한다는 것입니다. 먼저 역 참조하지 않습니다. 개체에 대한 포인터가 있으면 "->"를 사용하고 "."를 사용하십시오. 실제 객체 인스턴스로 작업 할 때

이것을 작성하는 또 다른 동등한 방법은 포인터에서 역 참조 "*"를 사용한 다음 "."을 사용하는 것입니다. "->"를 사용하여 중개인을 건너 뜁니다.

다른 차이점이 있지만 다른 답변은 이것을 광범위하게 다루었습니다.

Java에 대한 배경 지식이 있으면 혼란 스러울 수 있습니다. Java에서는 모든 것이 포인터이기 때문입니다. 즉, 포인터를 먼저 참조하지 않는 기호를 가질 이유가 없습니다. 그러나 C ++에서는 포인터가 무엇이고 무엇이 아닌지 기억하는 데 조금 더주의를 기울여야하며 접두사 "p_"또는 단순히 "p"로 레이블을 지정하는 것이 좋습니다.


포인터로 작업 할 때-> 연산자가 사용되고 그렇지 않으면 점이 사용됩니다. 따라서 다음과 같은 구조체 클래스가 있다면 :

struct class{ int num_students; int yr_grad; };

우리는 class * curr_class (클래스 포인터)의 인스턴스를 가지고 있습니다.

cout << curr_class->num_students << endl;

class_2016과 같은 간단한 클래스 객체가있는 경우

cout << class_2016.num_students << endl;

클래스에 대한 포인터의 경우-> 연산자는

(*obj).mem_var

참고 : 클래스의 경우 클래스의 멤버 함수에 액세스하는 방법도 동일합니다.

참고 URL : https://stackoverflow.com/questions/1238613/what-is-the-difference-between-the-dot-operator-and-in-c

반응형