클래스 구성원 포인터 - 오프셋
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 포인터를 사용하는 것이 좋습니다!
문 사용
1
cout<<&A::m_a<<&A::m_b;
결과는 모두 1이다.
그 이유는 ostream 대상에 클래스 구성원 바늘을 다시 불러오는 파라미터가 없기 때문에 클래스 구성원 바늘의 유형을 직접 출력할 수 없다. 우리는 바늘 형식과 bool 형식의 변환이 표준 변환에 속한다는 것을 알고 있다. (바늘의 합법성이 비어 있는지 테스트하는 데 자주 사용된다) ostream 대상은 bool 형식을 출력할 수 있기 때문에 컴파일러는 구성원 바늘 형식을 bool 형식으로 변환하여 출력한다.이왕 이렇게 된 거 왜 다 출력 1이야?주소가 모두 합법적이라는 것을 설명한다. 즉, 편이량이 모두 0보다 크다는 것이다. 아니지. 첫 번째 유형의 구성원의 편이량은 0이 아니잖아. 여기는 정말 모르겠다. 그러나 C++ 필수 사항에 이런 말이 있다. 대부분의 컴파일러들은 구성원 지침을 하나의 정수로 실현하고 가리키는 구성원의 편이량을 포함한다. 그리고 1(더하기 1은 값 0이 빈 데이터 구성원 지침을 나타낼 수 있도록 하기 위해서이다).이것은 아마도 전체 출력 1의 원인일 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어로 2차원 문자열 배열을 함수에서 반환하는 방법c 언어를 사용하고 2차원 문자열 배열을 함수에서 main 함수로 반환하는 방법에 대한 메모를 남겨 둡니다. ※포인터 초보자이므로, 설명이 잘못되어 있으면 지적 부탁합니다. paiza.io에서 실행해 보면 아래와 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.