학습 프로그래밍 : C ++에서 도트 (.) 연산자와->의 차이점은 무엇입니까? [복제]?


대답 1:

도트 연산자는 왼쪽 피연산자가 객체 이름이거나 객체에 대한 참조 인 객체 멤버에 대한 액세스를 제공합니다. 화살표 연산자는 왼쪽 피연산자 (일반 포인터)가 가리키는 객체의 멤버에 대한 액세스를 제공합니다.

더욱이, 화살표 연산자는 오버로드 될 수 있습니다. 따라서 왼쪽 피연산자가 일반 포인터가 아니라 개체 인 경우 연산자는 다른 의미를 가질 수 있습니다. 여전히 결과는 일반 포인터이거나 기존 객체 (액세스 연산자가 정의되어 있음)에 대한 참조 여야합니다. 구문 상 오른쪽 피연산자는 해당 오브젝트의 멤버 (기존 멤버의 식별자) 여야합니다.

화살표 연산자의 의미있는 과부하의 좋은 예는 스마트 포인터입니다. 이것들은 평범한 포인터를 감싸고 더 많은 기능 (동적 객체의 고유 한 소유권 또는 참조 횟수)을 추가하는 클래스입니다. 스마트 포인터에는 화살표 연산자가 오버로드되어 있으므로 해당 개체에 대한 일반 포인터의 경우와 마찬가지로 밑줄 개체에 액세스하는 데 사용할 수 있습니다.


대답 2:

간단한 말로 말해 줄 게요…

구조체 멤버에 액세스하려면 도트 연산자를 사용하십시오.

포인터를 통해 구조체의 멤버에 액세스하려면 화살표 연산자를 사용하십시오.

예를 들어, 다음 구조를 고려하십시오.

학생 구조 {
  int regNo;
  문자 이름 [25];
} std;

"suhail"값을 std 오브젝트의 이름 멤버에 지정하려면 다음과 같이 작성하십시오.

strcpy (std.name, "suhail");

ptr_std가 student 유형의 객체에 대한 포인터 인 경우 "suhail"값을 객체 std의 이름 멤버에 할당하면 다음과 같이 작성해야합니다.

strcpy (ptr_std-> 이름, "suhail");

대답 3:

포인터 연산자는 구문 설탕으로 알려져 있습니다. 실제로 필요한 것은 아니지만 프로그램을 쉽게 입력하고 읽을 수 있습니다. 진술

p-> 필드

~와 동일하다

(* p) .field

p가 실제로 포인터 인 경우 객체 인 경우 컴파일러는 대신 객체에서 operator-> () 메서드를 호출합니다.