c+const 포인터 와 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 함수 에 대한 몇 가지 규칙:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU 원활 공사 & & 원활 공사 (차 트 법)모 성 은 도시 의 교통 상황 을 조사 하여 기 존의 도시 도로 통계 표를 얻 었 고 표 에는 모든 도로 가 직접 연 결 된 도시 가 열거 되 어 있다.성 정부의 '원활 한 공사' 목 표 는 성 전체의 어느 두 도시...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.