클래스 구성원 포인터 - 오프셋

5013 단어 포인터
구성원 지침은 하나의 구성원의 편이량을 기록할 뿐 주소가 아니다. 클래스에 주소가 없기 때문에 하나의 클래스를 선택한 구성원은 클래스에서 편이하는 것을 의미할 뿐이다. 이 편이와 구체적인 대상의 첫 번째 주소를 결합해야만 실제 주소를 얻을 수 있다.
구성원 지침은 구체적인 메모리 위치를 가리키지 않고 특정한 유형의 특정한 구성원을 가리키며 특정한 대상의 특정한 구성원을 가리키지 않는다. 가장 직접적인 이해는 이를 하나의 편이량으로 이해하는 것이다.이 오프셋은 특정 클래스 A의 모든 대상에 적용된다. 다시 말하면 A클래스 대상의 구성원 a의 거리 기점의 오프셋이 4라면 다른 A클래스 대상의 a의 오프셋은 모두 4바이트이다.
  • 클래스 대상이 구성원을 방문할 때 해당 구성원이 클래스에서 편이하는 양에 따라 방문한다.
  • 클래스 구성원 지침은 주소가 아닌 클래스 데이터 구성원을 가리키는 편이량으로 이해할 수 있다.

  •  
    #include<stdio.h> #include<string.h> #include <iostream>
    using namespace std; class A { public: A() {m_a = 1; m_b = 2;} ~A() {} void fun() {printf("%d %d", m_a, m_b);} public: int m_a; int m_b; }; class B { public: B() {m_c = 3;} ~B() {} void fun() {printf("%d", m_c);} public: int m_c; }; int main() { A a; B *pb = (B*)(&a); pb->fun();             //1 m_a 
        cout << &a << endl;          //0012FF6C  a 
        cout << &(a.m_a) << endl;   //0012FF6C  m_a , a 
        cout << &(a.m_b) << endl;   //0012FF70
        printf("%p
    ",&A::a.m_a);   //00000000 printf("%p
    ",&A::a.m_b);   //00000004 printf("%p
    ",&B::a.m_c);  //00000000 cout << &A::a.m_a << endl;  //1 , printf,%p cout << &A::a.m_b << endl;  //1 , printf,%p return 0; }

     
    구성원 포인터의 값을 출력하려면 printf,%p 포인터를 사용하는 것이 좋습니다!
     
    문 사용
    1cout<<&A::m_a<<&A::m_b; 
    결과는 모두 1이다.
    그 이유는 ostream 대상에 클래스 구성원 바늘을 다시 불러오는 파라미터가 없기 때문에 클래스 구성원 바늘의 유형을 직접 출력할 수 없다. 우리는 바늘 형식과 bool 형식의 변환이 표준 변환에 속한다는 것을 알고 있다. (바늘의 합법성이 비어 있는지 테스트하는 데 자주 사용된다) ostream 대상은 bool 형식을 출력할 수 있기 때문에 컴파일러는 구성원 바늘 형식을 bool 형식으로 변환하여 출력한다.이왕 이렇게 된 거 왜 다 출력 1이야?주소가 모두 합법적이라는 것을 설명한다. 즉, 편이량이 모두 0보다 크다는 것이다. 아니지. 첫 번째 유형의 구성원의 편이량은 0이 아니잖아. 여기는 정말 모르겠다. 그러나 C++ 필수 사항에 이런 말이 있다. 대부분의 컴파일러들은 구성원 지침을 하나의 정수로 실현하고 가리키는 구성원의 편이량을 포함한다. 그리고 1(더하기 1은 값 0이 빈 데이터 구성원 지침을 나타낼 수 있도록 하기 위해서이다).이것은 아마도 전체 출력 1의 원인일 것이다.

    좋은 웹페이지 즐겨찾기