C++의 this 포인터 와 일반 대상 을 자세히 설명 합 니 다.

8095 단어 C++
C++this 포인터 상세 설명
this 는 C++의 키워드 이자 상수 포인터 로 현재 대상 을 가리 키 고 있 습 니 다(구체 적 으로 현재 대상 의 첫 번 째 주소 라 고 합 니 다).this 를 통 해 현재 대상 의 구성원 변수 와 구성원 함수 에 접근 할 수 있 습 니 다.
현재 대상 이란 stu.say()와 같은 사용 중인 대상 입 니 다.stu 는 현재 대상 입 니 다.시스템 이 stu 의 구성원 함수 say()에 접근 하고 있 습 니 다.
this 가 stu 대상 을 가리킨다 고 가정 하면 아래 문장 에서 this 는 pStu 의 값 과 같 습 니 다.

Student stu; //  Student      
Student *pStu = &stu;
[예제]this 를 통 해 구성원 변 수 를 방문 합 니 다.

class Student{
private:
  char *name;
  int age;
  float score;
public:
  void setname(char *);
  void setage(int);
  void setscore(float);
};
void Student::setname(char *name){
  this->name = name;
}
void Student::setage(int age){
  this->age = age;
}
void Student::setscore(float score){
  this->score = score;
}
이 예 에서 함수 파라미터 와 구성원 변수의 이름 을 바 꾸 는 것 은 문제 가 없습니다.this 를 통 해 구성원 변수 에 접근 한 것 이 고 this 가 없 는 변 수 는 함수 내부 의 국부 변수 이기 때 문 입 니 다.예 를 들 어 this->name=name;문장,할당 번호 왼쪽 은 클래스 의 구성원 변수 이 고 오른쪽 은 setname 함수 의 부분 변수,즉 매개 변수 입 니 다.
다음은 완전한 예 이다.

#include <iostream>
using namespace std;
class Student{
private:
  char *name;
  int age;
  float score;
public:
  void setname(char *);
  void setage(int);
  void setscore(float);
  void say();
};
void Student::setname(char *name){
  this->name = name;
}
void Student::setage(int age){
  this->age = age;
}
void Student::setscore(float score){
  this->score = score;
}
void Student::say(){
  cout<<this->name<<"     "<<this->age<<",    "<<this->score<<endl;
}
int main(){
  Student stu1;
  stu1.setname("  ");
  stu1.setage(15);
  stu1.setscore(90.5f);
  stu1.say();
  
  Student stu2;
  stu2.setname("  ");
  stu2.setage(16);
  stu2.setscore(80);
  stu2.say();
  return 0;
}
실행 결과:

       15,    90.5
       16,    80
대상 은 일반 변수 와 유사 합 니 다.모든 대상 은 몇 바이트 의 메모 리 를 차지 하여 구성원 변수의 값 을 저장 합 니 다.서로 다른 대상 이 사용 하 는 메모리 가 서로 겹 치지 않 기 때문에 작업 대상 A 는 대상 B 에 영향 을 주지 않 습 니 다.
위의 예 에서 대상 stu 1 을 만 들 때 this 지침 은 stu 1 이 있 는 메모리 의 첫 번 째 바이트 를 가리 키 며 값 은&stu 1 과 같 습 니 다.대상 stu 2 를 만 들 때 this 는&stu 2 와 같 습 니 다.대상 stu 3 를 만 들 때 도 마찬가지 입 니 다.
Student 클래스 에 멤버 함 수 를 추가 하고 this 의 값 을 출력 한 다 는 것 을 증명 해 보 겠 습 니 다.다음 과 같 습 니 다.

void Student::printThis(){
  cout<<this<<endl;
}
그리고 main 함수 에서 대상 을 만 들 고 printThis 를 호출 합 니 다.

Student stu1, *pStu1 = &stu1;
stu1.printThis();
cout<<pStu1<<endl;
Student stu2, *pStu2 = &stu2;
stu2.printThis();
cout<<pStu2<<endl;
실행 결과:

0x28ff30
0x28ff30
0x28ff10
0x28ff10
이 는 현재 대상 의 첫 주 소 를 가리 키 고 있 으 며,대상 에 따라 this 의 값 도 다르다 는 것 을 알 수 있 습 니 다.
몇 시 주의:
this 는 상수 포인터 입 니 다.그 값 은 수정 할 수 없습니다.할당,증가,체감 등 모든 작업 을 수정 하려 고 합 니 다.
this 는 구성원 함수 내부 에서 만 사용 할 수 있 고 다른 곳 은 의미 가 없 으 며 불법 입 니 다.
대상 이 생 성 된 후에 만 this 가 의미 가 있 기 때문에 static 구성원 함수 에서 사용 할 수 없습니다.나중에 말씀 드 리 겠 습 니 다.
this 도대체 뭐야
실제로 this 지침 은 함수 의 매개 변수 로 암시 적 으로 전달 되 며 매개 변수 목록 에 나타 나 지 않 습 니 다.구성원 함 수 를 호출 할 때 시스템 은 현재 대상 의 주 소 를 자동 으로 가 져 오고 this 에 값 을 부여 하 며 매개 변수의 전달 을 완성 합 니 다.사용자 가 관여 할 필요 가 없습니다.
this 는 암시 적 매개 변수 로 서 본질 적 으로 구성원 함수 의 부분 변수 로 대상 의 메모 리 를 차지 하지 않 습 니 다.구성원 함수 호출 이 발생 할 때 만 this 에 값 을 부여 하고 함수 호출 이 끝 난 후에 this 는 소각 되 었 습 니 다.
바로 this 는 매개 변수 로 대상 의 첫 주 소 를 표시 하기 때문에 함수 내부 에서 만 사용 할 수 있 고 대상 이 실례 화 된 후에 야 의미 가 있 습 니 다.
C++대상 및 구성원
C++는 데이터 의 안전성 을 높이 기 위해 효과 적 인 조 치 를 많이 취 했 지만 일부 데 이 터 는 공유 되 고 사람들 은 서로 다른 장소 에서 서로 다른 경 로 를 통 해 같은 데이터 대상 을 방문 할 수 있다.때때로 무의식 중 에 오 작 동 을 하면 데이터 와 관련 된 상황 이 바 뀌 는데,이것 은 사람들 이 원 하지 않 는 것 이다.
데 이 터 를 일정한 범위 내 에서 공유 할 수 있 도록 해 야 할 뿐만 아니 라 임의로 수정 되 지 않도록 해 야 한다.이때 const 를 사용 할 수 있다.즉,관련 데 이 터 를 상수 로 정의 할 수 있다.
일반 대상
대상 을 정의 할 때 대상 을 일반 대상 으로 지정 합 니 다.일반 대상 은 초기 값 이 있어 야 합 니 다.예 를 들 어:

  Time const t1(12,34,46); //t1    
이렇게 하면 모든 상황 에서 대상 t1 의 모든 구성원 의 값 을 수정 할 수 없습니다.데이터 구성원 이 변 하지 않도록 보장 하고 자 하 는 대상 은 정상 적 인 대상 으로 성명 할 수 있다.
일반 대상 을 정의 하 는 일반적인 형식 은:

     const    [(    )];
const 를 맨 왼쪽 에 쓸 수도 있 습 니 다.

  const       [(    )];
양자 등가.
대상 이 일반 대상 으로 밝 혀 지면 이 대상 의 비 const 형 구성원 함수(시스템 에서 자동 으로 호출 되 는 암시 적 구조 함수 와 분석 함수 제외)를 호출 할 수 없습니다.예 를 들 어 예 9.7 에서 정 의 된 Time 류 가 있다 면

  const Time t1(10,15,36); //     t1
  t1.get_time( ); //       t1   const     ,  
이 함수 들 이 일반 대상 의 데이터 구성원 의 값 을 수정 하 는 것 을 방지 하기 위해 서다.
프로그래머 의 세심 함 만으로 프로그램 이 틀 리 지 않도록 해 서 는 안 되 고 컴 파일 시스템 은 발생 할 수 있 는 상황 을 충분히 고려 하여 안전 하지 않 은 요 소 를 차단 해 서 는 안 된다.현재 컴 파일 시스템 은 함수 의 성명 만 검사 합 니 다.일반적인 대상 을 호출 한 구성원 함수 가 발견 되 고 이 함수 가 const 로 밝 혀 지지 않 으 면 오 류 를 보고 합 니 다.프로그래머 의 주 의 를 바 랍 니 다.
일반 대상 의 데이터 구성원 을 인용 하 는 것 은 간단 합 니 다.이 구성원 함 수 를 const 로 설명 하면 됩 니 다.예:

  void get_time( ) const ; //      const
gettime 은 const 형 함수,즉 일반 구성원 함수 입 니 다.
일반 구성원 함 수 는 일반 대상 의 데이터 구성원 에 게 접근 할 수 있 지만,일반 대상 의 데이터 구성원 의 값 을 수정 할 수 없습니다.때때로 프로 그래 밍 을 할 때 요구 가 있 습 니 다.일반적인 대상 중의 한 데이터 구성원 의 값 을 수정 해 야 합 니 다.ANSI C++는 실제 프로 그래 밍 시의 수 요 를 고려 하여 이에 대해 특별한 처 리 를 했 습 니 다.이 데이터 구성원 에 대해 mutable 이 라 고 성명 합 니 다.예 를 들 어:

  mutable int count;
count 를 가 변 적 인 데이터 구성원 으로 성명 하면 const 로 성명 한 구성원 함수 로 값 을 수정 할 수 있 습 니 다.
대상 멤버
대상 의 구성원 을 const 로 설명 할 수 있 으 며,일반 데이터 구성원 과 일반 구성원 함 수 를 포함 합 니 다.
1)일반 데이터 멤버
그 역할 과 용법 은 일반 변수 와 비슷 하 며,키워드 const 로 일반 데이터 구성원 을 설명 합 니 다.일반 데이터 구성원 의 값 은 바 꿀 수 없습니다.
한 가지 주의해 야 할 것 은 구조 함수 의 매개 변수 초기 화 표를 통 해 일반 데이터 구성원 을 초기 화 할 수 있 습 니 다.클래스 에서 일반 데이터 구성원 hour 를 정의 한 경우:

  const int hour; //  hour      
구조 함수 에서 일반 데이터 구성원 에 게 초기 값 을 부여 하 는 방법 을 사용 할 수 없습니다.아래 의 방법 은 불법 입 니 다.

  Time::Time(int h){
    hour=h;
  } //   
일반적인 데이터 구성원 은 할당 할 수 없 기 때문이다.
클래스 밖에서 구조 함 수 를 정의 하려 면 다음 과 같은 형식 으로 써 야 합 니 다.

  Time::Time(int h):hour(h){} //              hour   
일반 대상 의 데이터 구성원 은 모두 일반 데이터 구성원 이기 때문에 일반 대상 의 구조 함 수 는 매개 변수 초기 화 표 로 일반 데이터 구성원 을 초기 화 할 수 밖 에 없다.
2)상수 함수
앞에서 언급 한 바 와 같이 일반적인 구성원 함 수 는 이 클래스 의 비 const 데이터 구성원 을 참조 할 수도 있 고 수정 할 수도 있 습 니 다.구성원 함 수 를 일반 구성원 함수 로 설명 하면 이 클래스 의 데이터 구성원 만 참조 할 수 있 고 수정 할 수 없습니다.예 를 들 어 출력 데이터 등 입 니 다....와 같다

  void get_time( ) const ; //  const            
const 는 함수 형식의 일부분 으로 함수 와 함 수 를 설명 할 때 const 키 워드 를 사용 해 야 합 니 다.호출 할 때 const 를 추가 하지 않 아 도 됩 니 다.일반 구성원 함 수 는 const 데이터 구성원 을 참조 할 수도 있 고 비 const 데이터 구성원 을 참조 할 수도 있 습 니 다.const 데이터 구성원 은 const 구성원 함수 에 의 해 인 용 될 수도 있 고,비 const 의 구성원 함수 에 의 해 인 용 될 수도 있다.구체 적 인 상황 은 다음 표 로 표시 할 수 있다.

그러면 어떻게 일반 멤버 함 수 를 이용 합 니까?
한 클래스 에서 일부 데이터 구성원 의 값 이 변 할 수 있 고 다른 데이터 구성원 의 값 이 변 할 수 없 으 면 일부 데이터 구성원 을 const 로 설명 하여 값 이 변 하지 않도록 할 수 있 습 니 다.const 가 아 닌 구성원 함수 로 이 데이터 구성원 의 값 을 참조 하고 비 const 데이터 구성원 의 값 을 수정 할 수 있 습 니 다.
모든 데이터 구성원 의 값 을 변경 할 수 없 도록 요구 하면 모든 데이터 구성원 을 const 로 성명 하거나 대상 을 const(일반 대상)로 성명 한 다음 에 const 구성원 함수 로 데이터 구성원 을 인용 하여'이중 보험'의 역할 을 하여 확실하게 보증 할 수 있 습 니 다.
일반적인 대상 이 정의 되 어 있 으 면 const 구성원 함수 만 호출 할 수 있 고 비 const 구성원 함수 만 호출 할 수 없습니다.(이 함수 들 이 대상 의 데 이 터 를 수정 하 든 말 든)데이터 의 안전 을 확보 하기 위해 서다.방문 대상 의 데이터 구성원 이 필요 하 다 면,일반 대상 의 모든 구성원 함 수 를 const 구성원 함수 로 설명 할 수 있 으 나,함수 에서 대상 의 데이터 구성원 을 수정 하지 않도록 해 야 합 니 다.
일반 대상 중의 구성원 함수 가 모두 일반 구성원 함수 라 고 오해 하지 마라.일반 대상 은 데이터 구성원 이 일반 데이터 구성원 임 만 보증 하고 그 값 은 수정 되 지 않 습 니 다.일반 대상 의 구성원 함수 에 const 성명 을 추가 하지 않 으 면 컴 파일 시스템 은 비 const 구성원 함수 로 처리 합 니 다.
또 하 나 는 일반 구성원 함수 가 다른 비 const 구성원 함 수 를 호출 할 수 없다 는 점 을 지적 해 야 한다.

좋은 웹페이지 즐겨찾기