c+const 포인터 와 const 를 가리 키 는 지침 을 상세 하 게 분석 합 니 다.

최근 에 C++를 복습 하고 있 습 니 다.포인터 라 는 것 은 정말 어 려 운 점 입 니 다.오 랜 만 에 알 아 보지 못 했 습 니 다.오늘 밤 에 const 지침 을 잘 정리 하고 오 랜 만 에 블 로 그 를 써 서 기록 해 보 세 요~
const 포인터 정의:
const 포인 터 는 포인터 변수의 값 이 초기 화 되면 방향 을 바 꿀 수 없고 초기 화 는 필요 합 니 다.그 정의 형식 은 다음 과 같다.
type*const 포인터 이름;
포인 터 를 설명 할 때,형식 앞 이나 뒤에 키워드 const 를 사용 할 수도 있 고,두 위치 에서 모두 사용 할 수도 있 습 니 다.예 를 들 어 아래 는 모두 합 법 적 인 성명 이지 만 의 미 는 크게 다르다.
const int * pOne;    //성형 상수 의 지침 을 가리 키 며,가리 키 는 값 은 수정 할 수 없습니다.
int * const pTwo;    //성형 을 가리 키 는 상수 지침 은 다른 변 수 를 가리 킬 수 없 지만 가리 키 는 값 은 수정 할 수 있 습 니 다.
const int *const pThree;  //성형 상수 의 상수 지침 을 가리킨다.그것 은 다른 상수 도 가리 키 지 못 하고 가리 키 는 값 도 수정 할 수 없다.
이러한 성명 을 이해 하 는 기 교 는 키워드 const 오른쪽 을 보고 상수 로 성명 되 는 것 을 확인 하 는 것 입 니 다.이 키워드 의 오른쪽 이 유형 이 라면 값 은 상수 입 니 다.키워드 의 오른쪽 이 포인터 변수 라면 포인터 자체 가 상수 입 니 다.아래 의 코드 는 이 점 을 설명 하 는 데 도움 이 된다.

const int *p1; //the int pointed to is constant

int * const p2; // p2 is constant, it can't point to anything else
const 포인터 와 const 구성원 함수
키 워드 를 구성원 함수 에 사용 할 수 있 습 니 다.예 를 들 면:

class Rectangle

{

  pubilc:

  .....

  void SetLength(int length){itslength = length;}

  int GetLength() const {return itslength;} //         

  .....

  private:

  int itslength;

  int itswidth;

};
구성원 함수 가 const 로 밝 혀 졌 을 때 대상 의 데 이 터 를 수정 하려 고 하면 컴 파일 러 는 오류 로 간 주 됩 니 다.
const 대상 을 가리 키 는 지침 이 밝 혀 지면 이 지침 을 통 해 const 방법(구성원 함수)만 호출 할 수 있 습 니 다.
예 를 들 어 세 개의 서로 다른 Rectangle 대상 을 설명 합 니 다.

Rectangle* pRect = new Rectangle;

const Rectangle * pConstRect = new Rectangle;  //  const  

Rectangle* const pConstPtr = new Rectangle;// pConstRect   const     ,        const     , GetLength()。
const 포인터 와 const 를 가리 키 는 포인터
       const 가 있 는 지침 을 사용 할 때 사실은 두 가지 의미 가 있다.하 나 는 지침 자체 의 내용 을 수정 할 수 없다 는 것 을 말 하 며,다른 하 나 는 지침 이 가리 키 는 내용 을 수정 할 수 없다 는 것 을 말한다.좀 헷 갈 리 는 것 같 아 요.
      먼저 const 를 가리 키 는 지침 을 말 합 니 다.지침 이 가리 키 는 내용 은 수정 할 수 없다 는 뜻 입 니 다.그것 은 두 가지 서법 이 있다.
      const int* p; (추천 하 다
      int const* p;
      첫 번 째 는 p 는 하나의 지침 으로 이해 할 수 있 으 며,그것 이 가리 키 는 내용 은 const int 유형 이다.p 자 체 는 초기 화 하지 않 아 도 표시 자 를 가리 킬 수 있 지만 가리 키 는 내용 은 바 꿀 수 없습니다.
      두 번 째 는 p 가 int 를 가리 키 는 const 지침 으로 이해 되 기 쉽 지만 이렇게 이해 하 는 것 은 잘못된 것 입 니 다.또한 const 를 가리 키 는 지침(지침 이 가리 키 는 내용 은 수정 할 수 없 음)을 나타 내 는 것 입 니 다.이것 은 첫 번 째 표현 과 같은 뜻 입 니 다.헷 갈 리 지 않도록 1 종 을 추천 합 니 다.
      게다가 const 지침 은 지침 자체 의 값 을 수정 할 수 없다 는 뜻 이다.그것 은 단지 하나의 서법 만 있다.
      int*const p=주소;(포인터 자체 의 값 은 수정 할 수 없 기 때문에 초기 화 되 어야 합 니 다)
      이런 형식 은 p 는 하나의 지침 이 고 이 지침 은 int 를 가리 키 는 const 지침 으로 이해 할 수 있다.그것 이 가리 키 는 값 은*p=3 과 같이 변 경 될 수 있 습 니 다.
      또 하 나 는 이 지침 자체 와 그 가 가리 키 는 내용 이 바 뀌 지 않 는 다 는 것 입 니 다.아래 를 보 세 요.
      const int*const p=주소;
      int const*const p=주소;
       위의 내용 을 보면 좀 어 지 럽 지 않 습 니까?괜 찮 습 니 다.외 울 필요 가 없습니다.많이 사용 하면 알 수 있 습 니 다.그리고 기술 도 있 습 니 다.위의 관찰 을 통 해 우 리 는 약간의 규칙 을 정리 하 는 것 이 어렵 지 않 습 니 다.무엇 입 니까?이 규칙 은 const 를 가리 키 는 지침(지침 이 가리 키 는 내용 은 수정 할 수 없습니다)const 관 건 자 는 항상*의 왼쪽 에 나타 나 고 const 지침(지침 자체 가 수정 할 수 없습니다)const 관 건 자 는 항상*의 오른쪽 에 나타 납 니 다.두 const 중간 에*를 추가 하 는 것 은 물론 지침 자체 와 그 가 가리 키 는 내용 도 바 꿀 수 없습니다.이 규칙 이 있 었 으 면 기억 하기 쉬 웠 을 텐 데.

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
 int a=3;
 int b;
 
 /*    const   (            )*/ 
 const int* p1; 
 int const* p2; 
 
 /*  const  (                    )*/ 
 int* const p3=&a; 
 
 /*                          */
 const int* const p4=&a;
 int const* const p5=&b; 
 
  p1=p2=&a; //  
  *p1=*p2=8; //   (            )
 
  *p3=5; //  
  p3=p1; //   (          ) 
 
  p4=p5;//    (                  ) 
  *p4=*p5=4; //   (                  ) 
  
 return 0; 
}
const 용법 소결:
const 에서 가장 자주 사용 하 는 것 은 상수 정의 입 니 다.그 밖 에 함수 의 매개 변수,반환 값 과 함수 의 정의 체 를 수식 할 수 있 습 니 다.
1.const 수식 함수 의 매개 변수
만약 에 매개 변수 가 출력 용 으로 사용 된다 면 어떤 데이터 형식 이 든'포인터 전달'이 든'인용 전달'이 든 const 수식 을 추가 할 수 없습니다.그렇지 않 으 면 이 매개 변 수 는 출력 기능 을 잃 게 될 것 입 니 다.
const 는 입력 매개 변수 만 수식 할 수 있 습 니 다:
입력 매개 변수 가'포인터 전달'을 사용 하면 const 수식 을 추가 하면 의외로 이 지침 을 바 꾸 는 것 을 방지 하고 보호 역할 을 할 수 있 습 니 다.
"const&"입력 매개 변 수 를 수식 하 는 용법 을 다음 과 같이 요약 합 니 다.
(1)비 내부 데이터 형식의 입력 매개 변 수 는'값 전달'방식 을'const 참조 전달'으로 바 꾸 고 효율 을 높이 는 것 이 목적 이다.예 를 들 어 void Func(A)를 void Func(const A&a)로 변경 합 니 다.
(2)내부 데이터 형식의 입력 매개 변 수 는'값 전달'방식 을'const 참조 전달'으로 바 꾸 지 마 십시오.그렇지 않 으 면 효율 을 높이 는 목적 에 이 르 지 못 할 뿐만 아니 라 함수 의 이해 성도 떨 어 뜨 린 다.예 를 들 어 void Func(int x)는 void Func(const int&x)로 바 꾸 지 말 아야 합 니 다.
2.const 수식 함수 의 반환 값
'포인터 전달'방식 의 함수 반환 값 에 const 수식 을 추가 하면 함수 반환 값(즉 포인터)의 내용 을 수정 할 수 없습니다.이 반환 값 은 const 수식 을 추가 한 같은 유형의 지침 만 부여 할 수 있 습 니 다.함수
const char * GetString(void);
다음 문장 에 컴 파일 오류 가 발생 합 니 다:
char *str = GetString();
정확 한 용법 은?
const char *str = GetString();
반환 값 이 내부 데이터 형식 이 아니라면 함수 A GetA(void)를 const A&GetA(void)로 바 꾸 면 효율 을 높 일 수 있 습 니 다.그러나 이때 절대 조심해 야 합 니 다.함수 가 한 대상 의'복사'로 돌아 가 고 싶 은 지,아니면'별명'으로 돌아 가 고 싶 은 지 알 아야 합 니 다.그렇지 않 으 면 프로그램 이 잘못 될 수 있 습 니 다.
함수 반환 값 은'인용 전달'을 사용 하 는 장소 가 많 지 않 습 니 다.이런 방식 은 보통 유형의 할당 함수 에 만 나타 나 는데 목적 은 체인 표현 을 실현 하기 위해 서 입 니 다.
예 를 들 면:

class A
{
A & operate = (const A &other); //     
};
A a, b, c; // a, b, c  A    
a = b = c; //        
(a = b) = c; //         ,   
할당 함수 의 반환 값 을 const 로 수식 하면 이 반환 값 의 내용 은 변경 되 지 않 습 니 다.상례 에서 문장 a=b=c 는 여전히 정확 하지만 문장(a=b)=c 는 불법이다.
3.const 수식 멤버 함수
Const 함수 에 대한 몇 가지 규칙:
  •  const 대상 은 const 구성원 함수 에 만 접근 할 수 있 으 며,const 대상 이 아 닌 임의의 구성원 함수 에 접근 할 수 있 습 니 다.const 구성원 함수 포함
  •  const 대상 의 구성원 은 수정 할 수 없 지만,const 대상 이 지침 을 통 해 유지 하 는 대상 은 수정 할 수 있 습 니 다.
  •  const 구성원 함 수 는 대상 의 데 이 터 를 수정 할 수 없습니다.대상 이 const 성질 을 가지 고 있 든 없 든 간 에 컴 파일 할 때 구성원 의 데 이 터 를 수정 하 는 지 여 부 를 근거 로 검 사 를 진행 합 니 다
  •  그러나 mutable 수정자 의 데이터 구성원 을 더 하면 어떠한 상황 에서 도 모든 수단 을 통 해 수정 할 수 있 습 니 다.자 연 스 럽 게 이때 const 구성원 함 수 는 수정 할 수 있 습 니 다
  • 이상 은 c+const 포인터 와 const 를 가리 키 는 포인터 의 상세 한 내용 을 상세 하 게 분석 하 는 것 입 니 다.c+const 포인터 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기