C++기본 this 포인터 와 다른"다 중"

5918 단어 C++이 지침다 형
1.하나의 클래스 를 정의 하 는 대상 을 도입 합 니 다.먼저 시스템 은 이 대상 에 게 공간 을 분배 한 다음 에 구조 함 수 를 호출 합 니 다.하나의 클래스 에 여러 개의 대상 이 있 습 니 다.프로그램 에서 대상 의 특정한 함 수 를 호출 할 때 이 대상 의 구성원 변 수 를 방문 할 수 있 습 니 다.같은 클래스 의 모든 대상 에 대해 같은 클래스 함 수 를 공유 합 니 다.대상 은 단독 변수 가 있 지만 단독 함수 가 없 기 때문에 함 수 를 호출 할 때 시스템 은 함수 에 게 이것 이 어느 대상 의 조작 인지 알 게 하여 구성원 변수 가 어느 대상 인지 확인 해 야 합 니 다.구성원 변 수 를 대상 으로 구분 하 는 데 사용 되 는 것 을 this 지침 이 라 고 합 니 다.사실 그것 이 대상 의 주소 라 는 점 은 어 셈 블 리 코드 에서 볼 수 있다.
2.분석 1.테스트 코드:

/////////////////////////////////////////////////////////////////////////////////////
#include<iostream>
using   namespace   std;
/////////////////////////////////////////////////////
class A
{
public:
    A(char *szname)
    {
        cout<<"construct"<<endl;
        name
 = new char[20];
        strcpy(name,
 szname);
    }
    ~A()
    {
        cout<<"destruct"<<endl;
        delete name;
    }
    void    show();
private:
    char    *name;
};
/////////////////////////////////////////////////////
void    A::show()
{
    cout<<"name
 = "<<name<<endl;
}
/////////////////////////////////////////////////////
int main()
{
    A
 a("zhangsan");
    a.show();
    system("pause");
    return 0;
}
프로그램 은 VC++6.0 32 비트 운영 체제 에서 컴 파일 되 고 실 행 됩 니 다.컴 파일 된 EXE 파일 을 역 어 셈 블 리 합 니 다.어 셈 블 리 도 구 는 OllyDbg 입 니 다.
2.어 셈 블 리 분석 관건 점 캡 처 는 다음 과 같다.(1)그림 1 에서 this 포인터 가 ECX 레지스터 를 통 해 구성원 함수 에 전달 되 는 것 을 발견 할 수 있다.this 지침 은 대상 의 주소 입 니 다.

그림 1 주요 함수
(2)그림 2 에서 방문 대상 의 구성원 변 수 는 ECX 를 통 해 들 어 온 this 지침 을 사용 하 는 것 을 발견 할 수 있다.
 
그림 2 show()함수
3.캡 처 와 관련 된 자 료 를 깊이 이해 하면 구조 함수,show()함 수 를 호출 하기 전에 그 ECX 가 바로 this 지침 이라는 것 을 잘 알 수 있다.즉,이것 은 검증 적 인 실험 이 고 답 은 이미 명확 하 다.해 야 할 일 은 바로 신체 검 사 를 하 는 것 이다.그러나 만약 에 제 가 C++를 모 르 고 this 지침 을 모 르 면 저 는 이'this 지침'이라는 것 을 발견 할 수 있 습 니 다.OD 의 동적 디 버 깅 을 통 해 name 이 표시 되 었 을 때 점차적으로 거 슬러 올 라 가면 name 의 원천 이 ECX 라 는 것 을 알 수 있 습 니 다.OD 를 다시 불 러 옵 니 다.show()함수 에 들 어가 기 전에 ECX 가 어디서 왔 는 지 확인 합 니 다.마지막 으로 ECX 는 하나의 주소 입 니 다.이 주소 의 첫 번 째 값 도 하나의 주소 로 문자열 을 가리 키 고 있 습 니 다.다시 위로 분석 하면 show()위의 구조 함수 에 들 어가 면 안에 new 작업,strcpy 작업 이 있 는 것 을 발견 할 수 있 습 니 다.여기 서 문자열 공간,내용 의 출처 를 발견 할 수 있 습 니 다.이로써 기본적으로 분석 이 끝났다.이 과정 을 통 해 많은 C++지식 을 발견 할 수 있 습 니 다.예 를 들 어 대상 의 공간 은 구조 함 수 를 호출 하기 전에 분 배 된 것 이다.대상 에 함수 가 없습니다.this 지침 은 레지스터 ECX 를 통 해 전달 합 니 다.설명 을 통 해 정 의 된 대상 의 공간 을 창고 에 분배 합 니 다.등등 시스템 이나 C++와 관련 된 지식 들.그러나 C++를 모 르 는 사람 에 게 는 위의 경험 이 없다.어 셈 블 리 명령 에서 C++의 사상 을 볼 수 없습니다.this 지침 은 주소 에 불과 합 니 다.대상 은 일부 공간 에 불과 하 다.구조 함수,분석 함수 및 기타 함수 도 명령 의 집합 에 불과 하 다.C++의 같은 클래스 에서 정 의 된 여러 대상 은 어 셈 블 리 명령 으로 볼 때 이 렇 습 니 다.여러 개의 주소 공간 이 있 고 똑 같은 크기 가 있 습 니 다.서로 다른 대상 이 구성원 함 수 를 호출 할 때 어 셈 블 리 명령 은 다음 과 같 습 니 다.모두 call 같은 주소 입 니 다.이 call 명령 은 사실 안에 jmp 명령 입 니 다.특정한 위치 로 이동 하 는 데 사 용 됩 니 다.call 명령 전에 보통 하나의 주 소 를 ECX 에 넣 습 니 다.물론 스 택 이나 다른 레지스터 를 사용 합 니 다.C++의 계승,다 중,패 키 징 은 어 셈 블 리 프로그래머 에 게 신기 한 것 이 없다.C+프로그래머 에 게 는 다 르 기 때문에 많은 일 을 절약 하고 많은 일 을 컴 파일 러 에 게 맡 겨 컴 파일 러 가 자동 으로 해결 하도록 할 수 있다.C++프로그래머 가 토론 한 대상 과 그 많은 특징,장점 은 결국'저급'의 명령 이 되 었 고 효율 이 낮은 명령 일 수도 있다.그럼 에 도 불구 하고 그의 장점 은 단점 보다 훨씬 크 고 프로 그래 밍 을 쉽 고 효율 적 으로 만 들 었 다.
4.연장 은 갑자기 C++의 다 형 이 생각 났 습 니 다.한 마디 로'하위 유형의 지침 을 부모 유형의 지침 에 부여 합 니 다'는 다 형 은 가상 함 수 를 통 해 이 루어 집 니 다.허 함수 와 그 관련 내용 의 원리,상세 한 이 해 는 자세히 말 하지 않 겠 다.제 간단 한 이 해 를 말씀 드 리 겠 습 니 다.기본 클래스 A 와 하위 클래스 B,C 가 있 습 니 다.한 함수 가 기본 클래스 A 의 지침 을 매개 변수 로 한 다음 에 함수 에서 지침 을 통 해 기본 클래스 의 구성원 함 수 를 호출 합 니 다.만약 에 이 호출 된 기본 구성원 함수 가 가상 함수 가 아니라면 다 중 태 도 를 실현 할 수 없습니다.어 셈 블 리 명령 으로 번역 할 때 구성원 함 수 를 호출 하 는 이곳 은 콜 명령 입 니 다.그리고 이 콜 명령 은 어 딘 가 에 가서 실 행 됩 니 다.이것 은 고정된 주소 입 니 다.가상 함수 로 정의 하여 구성원 함 수 를 호출 하 는 이 곳 은 가상 함수 표 지침 을 통 해 어떤 함 수 를 호출 하 는 지 확인 하 는 것 이 고,가상 함수 표 지침 은 대상 의 주소 공간 에 놓 여 있 으 며,대상 이 변 하면 가상 함수 표 지침 도 변 하고 호출 함수 도 달라 집 니 다.기본 클래스 A 의 지침 을 매개 변수 로 하 는 함수 에 대해 지침 은 대상 의 주소 입 니 다.전달 하 는 주소 가 하위 클래스 B 또는 C 의 대상 의 주소 라면 가상 함수 표 지침 도 다 르 고 호출 된 구성원 함수 도 다 릅 니 다.이것 이 바로 다 형 입 니 다.이런 다 형 은 같은 함 수 를 호출 할 수 있 습 니 다.전달 매개 변수 가 다 르 기 때문에 차 이 를 나타 내 고 매개 변 수 는 기본 적 인 대상 이나 여러 가지 다른 하위 대상 일 수 있 습 니 다.그것들의 차 이 는 종류 와 종류 사이 의 것 이다.가상 함수 가 있 는 대상 의 메모리 레이아웃 은 가상 함수 가 없 는 대상 보다 가상 함수 표를 가리 키 는 지침 이 많 습 니 다.가상 함수 의 호출 은 가상 함수 표 지침 을 통 해 이 루어 지기 때문에 다 형 이 있 습 니 다.C++의 this 지침,한 클래스 의 구성원 함 수 를 고려 하여 this 지침 에 따라 서로 다른 대상 을 구분 합 니 다.즉,this 지침 에 따라 서로 다른 대상 을 방문 하 는 구성원 변 수 를 실현 한 것 입 니 다.이것 도 다 태 적 인 표현 입 니까?여기 서 말 하 는 다 형 은'부모 포인터 가 하위 클래스 대상 을 가리 키 는'교조 가 아니 라 같은 유형의 서로 다른 대상 사이 에 나타 나 같은 구성원 함 수 를 호출 하고 매개 변수 인'this 포인터'에 따라 서로 다른 대상 을 방문 하 는 구성원 변 수 를 실현 한다.구성원 함수 가 구성원 변 수 를 방문 합 니 다.컴 파일 기간 에 방문 한 구성원 변수 가 어느 주소 에 있 는 지 확인 할 수 없습니다.실행 기간 이 되면 this 지침 에 따라 방문 주 소 를 확인 할 수 있 습 니 다.이 점 은 클래스 의 다 형 과 유사 합 니 다.기본 포인터 를 매개 변수 로 하 는 함수 에서 특정한 기본 클래스 의 가상 구성원 함 수 를 호출 했 습 니 다.컴 파일 기간 에 프로그램 이 실 행 될 때 어떤 대상 을 호출 할 지 확인 할 수 없습니다.실행 기간 이 되 어야 만 어떤 대상 을 호출 할 지 확인 할 수 있 습 니 다.this 지침 은 같은 종류의 다른 대상 을 식별 합 니 다.다시 말 하면 this 지침 은 구성원 함수 가 같은 종류의 다른 대상 에 접근 할 수 있 도록 합 니 다.좀 더 깊이 들 어가 면 this 지침 은 구성원 함수 가 this 지침 에 따라 서로 다른 구성원 변 수 를 방문 하 게 합 니 다.이것 도 다 형 이지 요.다만 이것 은 필연 적 으로 존재 하 는 다 형 입 니 다.이런 다 형 과 기본 류 와 파생 류 간 의 다 형 은 서로 다른 등급 의 다 형 입 니 다.일반적인 다 형 은 가상 함 수 를 사용 하 는 선택 을 통 해 취사선택 할 수 있 는 것 이 아니 라 여러 대상 에 대응 하고 여러 대상 이 구성원 함수 코드 를 공유 하 는 필연 적 인 결과 입 니 다.

좋은 웹페이지 즐겨찾기