2014-03-13 9 views
11

이것은 호출 객체에 대한 포인터입니다 (r- 값을 반환 함).& ** 정확히 무엇을 반환합니까?

* this는 호출 객체의 포인터에 대한 포인터입니다 (주소 값을 반환 함).

** this는 호출 객체 (???)의 포인터 포인터에 대한 포인터입니다.

& *** 이것은 호출 객체 (???)의 포인터 포인터 포인터에 대한 참조입니다.

std::vector<int>:: iterator i = vector1.begin(); 

i는 자체 r 값 (자체 값 반환)에 대한 포인터입니다.

* i는 벡터에 포함 된 객체의 r 값을 가리키는 포인터입니다 (& 값이 가리키는 값을 반환).

** i는 벡터 (???)에 포함 된 개체의 r 값 포인터에 대한 포인터입니다.

나는 정말로 혼란 스럽다.

class _Iter 
{ 
private: 
    ListElem *pCurr; 
    const List *pList; 

public: 
    _Iter(ListElem *pCurr, const List *list) 
     : pCurr_(pCurr), pList(list) 
    {} 

    T& operator*() { return pCurr_->data; } 
    T* operator->() { return &**this; } 
}; 
+0

호출자는'& pCurr-> data'를 얻습니다. –

+1

'*'는 선언문이나 실행 문에 따라 정확히 뒤에서 작동한다는 것을 기억해야합니다. –

+0

"이것은 호출 객체에 대한 포인터입니다 (r- 값을 반환합니다)"명명 된 변수는 r- 값일 수 없습니다 –

답변

20

this 현재 개체에 대한 포인터입니다 :

는 여기에 우리가 표현 & **이 찾을 샘플 코드입니다.

*this은 현재 개체 (예 : this 역 참조)에 대한 참조입니다.

**this은 현재 개체에서 호출 된 오버로드 된 단항 operator* 함수의 반환 값입니다.

**this에서 반환 된 개체의 오버로드 된 operator&() 함수가있는 경우 &**this(**this).operator&()의 반환 값으로 계산됩니다. 그렇지 않으면 &**this은 현재 개체에서 호출 된 오버로드 된 단항 operator* 함수의 반환 값에 대한 포인터입니다.

예 :

#include <iostream> 

struct A 
{ 
    int b; 
    int a; 
    int& operator*() {return a;} 

    int* test() 
    { 
     return &**this; 
    } 
}; 

int main() 
{ 
    A a; 
    std::cout << "Address of a.a: " << a.test() << std::endl; 
    std::cout << "Address of a.a: " << &(*a) << std::endl; 
    std::cout << "Address of a.a: " << &(a.a) << std::endl; 
    return 0; 
} 

샘플 출력 :

Address of a.a: 0x7fffbc200754 
Address of a.a: 0x7fffbc200754 
Address of a.a: 0x7fffbc200754 
+7

이것이 더 명확하거나 혼란스럽게 보이는지 확인하십시오 : '** this' 'this -> operator *()'로 해석 될 수있다. 그러므로'& ** this'는 현재 객체에 대한 오버로드 된'*'연산자의 반환 값의 주소를 취하는'& (this-> operator *())'입니다 : P –

+1

'& ** this'는' operator &'단항 연산자'*'의 반환 값을 호출합니다. 실제로'operator *'가 비표준을 반환하면 임시 주소를 취할 수 없기 때문에 비어 있어야합니다. –

+0

@MattMcNabb, 우수한 점. –

2

당신이 클래스 Foothis를 사용하는이 클래스의 방법과 다음 객체 Foo obj

this이있는 경우 -이다 주소가 객체인 pointer to Foo 유형의 값 그래서

당신이 (푸의 예 : 테스트()) : 다음과 같이 쓸 수 있습니다

Foo *addr = this; 

그래서 addr 클래스 Foo의 객체 obj의 주소 값으로 초기화됩니다 유형 pointer to Foo의 변수입니다 .

C++의 모든 포인터는 *으로 역 참조 할 수 있습니다. 그들은 같은 객체이기 때문에 그래서 당신은 개체에 대한 포인터 역 참조하면, 코드의

Foo *addr = get_pointer_to(obj); //function that return a pointer to object 

//three equivalent ways to call someMethod() of object obj of class Foo 
obj.someMethod(); 
addr->someMethod(); 
(*addr).someMethod(); 

상단 부분은 객체 obj 및 역 참조 포인터 (*addr)가 동일한 구문을 가지고 있음을 보여 그 객체를 얻을 때.

C++에서는 다른 언어 연산자를 오버로드 할 수 있습니다. 그래서 당신이 쓸 때 (** this) 컴파일러는 this을보고 에 대한 포인터 유형 인 this이 있으므로 역 참조 *thisFoo 유형의 객체를 제공합니다. 그런 다음 컴파일러에서 (* (*this))을 찾습니다. 그러나 Foo은 포인터 유형이 아니므로 기본적으로 * 연산자가 없습니다. 따라서 컴파일러는 오류를 returen하고 컴파일을 중단합니다. 하지만 Foo 클래스에 operator*()을 정의하면 (overload) 컴파일러는이 메소드를 호출합니다. 따라서 **thisthis->operator*() 또는 (*this).operator*()과 같습니다.

마지막 하나는 operator&()입니다. 기본적으로이 연산자는 객체에 대한 포인터를 반환합니다. 물론 과부하가 걸리고 다른 것을 되돌릴 수 있습니다. 그래서 &**this))은 대상물 (*이) (*이 적용되었다 operator*() 의해 리턴 된 객체의 메소드 operator&()
2) 리턴 값인가 operator*() 의해 리턴 된 객체의 주소를 1을 반환 할 .

operator*()이 정의되어 있지 않으면 &**this이 컴파일되지 않습니다.

operator*()이 정의되고 operator&()이 정의되지 않은 경우 &**some_pointer의 구성은 컴파일되지 않거나 (* some_pointer) 반환됩니다. 그리고 (* some_pointer)가 포인터가 될 것이라고 보증 할 수 있습니다.

관련 문제