const 포인터가 적용 가능한 예는 이와 같이 설명 될 수있다. 내부에 동적 배열이있는 클래스가 있고 사용자에게 포인터 변경 권한을 부여하지 않고 배열에 대한 액세스 권한을 전달하려고합니다. 치다:
#include <new>
#include <string.h>
class TestA
{
private:
char *Array;
public:
TestA(){Array = NULL; Array = new (std::nothrow) char[20]; if(Array != NULL){ strcpy(Array,"Input data"); } }
~TestA(){if(Array != NULL){ delete [] Array;} }
char * const GetArray(){ return Array; }
};
int main()
{
TestA Temp;
printf("%s\n",Temp.GetArray());
Temp.GetArray()[0] = ' '; //You can still modify the chars in the array, user has access
Temp.GetArray()[1] = ' ';
printf("%s\n",Temp.GetArray());
}
어느 생산 :
입력 데이터
넣기 데이터
그러나 우리가 이것을 시도하면 :
int main()
{
TestA Temp;
printf("%s\n",Temp.GetArray());
Temp.GetArray()[0] = ' ';
Temp.GetArray()[1] = ' ';
printf("%s\n",Temp.GetArray());
Temp.GetArray() = NULL; //Bwuahahahaa attempt to set it to null
}
우리는 얻는다 :
오류 : 할당의 왼쪽 피연산자로 lvalue가 필요합니다.
따라서 배열의 내용은 수정할 수 있지만 배열의 포인터는 수정할 수 없습니다. 포인터를 사용자에게 다시 전달할 때 포인터가 일관된 상태를 유지하도록하려면 좋습니다. 그러나 하나의 캐치가 있습니다.
int main()
{
TestA Temp;
printf("%s\n",Temp.GetArray());
Temp.GetArray()[0] = ' ';
Temp.GetArray()[1] = ' ';
printf("%s\n",Temp.GetArray());
delete [] Temp.GetArray(); //Bwuahaha this actually works!
}
포인터 자체를 수정할 수없는 경우에도 포인터의 메모리 참조를 삭제할 수 있습니다.
따라서 메모리 참조가 항상 무언가를 가리 키기를 원한다면 (IE는 절대로 참조가 작동하는 방식과 유사하게 수정되지 않음) 매우 적합합니다. 사용자가 전체 액세스 권한을 갖고 수정하기를 원한다면, 비 const가 당신을위한 것입니다.
편집하다:
GetArray ()가 올바른 값 피연산자로 인해 할당 할 수 없다는 okorz001 의견을 지적한 후에는 주석이 완전히 정확하지만 위의 내용은 포인터에 대한 참조를 반환하는 경우에도 여전히 적용됩니다 (GetArray가 예를 들어 참조를 참조하십시오.
class TestA
{
private:
char *Array;
public:
TestA(){Array = NULL; Array = new (std::nothrow) char[20]; if(Array != NULL){ strcpy(Array,"Input data"); } }
~TestA(){if(Array != NULL){ delete [] Array;} }
char * const &GetArray(){ return Array; } //Note & reference operator
char * &GetNonConstArray(){ return Array; } //Note non-const
};
int main()
{
TestA Temp;
Temp.GetArray() = NULL; //Returns error
Temp.GetNonConstArray() = NULL; //Returns no error
}
첫 번째 오류를 반환합니다 :
오류 : 읽기 전용 위치 'Temp.TestA :: GetArray ()'할당
그러나 두 번째는 아래에 잠재적 결과에도 불구하고 즐겁게 발생합니다.
분명히 '왜 포인터에 대한 참조를 반환하고 싶습니까?'라는 질문이 제기 될 것입니다. 문제의 원래 포인터에 직접 메모리 (또는 데이터)를 할당해야하는 경우가 드물지만 (예 : 자신의 malloc / free 또는 new / free 프론트 엔드 구축),이 경우에는 상수가 아닌 참조입니다 . const 포인터에 대한 참조 나는 그것을 반환하는 상황을 보지 못했습니다 (반환 유형이 아닌 선언 된 const 참조 변수가 아닌 한)?
const 포인터를 사용하는 함수가 없는지 고려하십시오 (그렇지 않은 함수 포인터).
class TestA
{
private:
char *Array;
public:
TestA(){Array = NULL; Array = new (std::nothrow) char[20]; if(Array != NULL){ strcpy(Array,"Input data"); } }
~TestA(){if(Array != NULL){ delete [] Array;} }
char * const &GetArray(){ return Array; }
void ModifyArrayConst(char * const Data)
{
Data[1]; //This is okay, this refers to Data[1]
Data--; //Produces an error. Don't want to Decrement that.
printf("Const: %c\n",Data[1]);
}
void ModifyArrayNonConst(char * Data)
{
Data--; //Argh noo what are you doing?!
Data[1]; //This is actually the same as 'Data[0]' because it's relative to Data's position
printf("NonConst: %c\n",Data[1]);
}
};
int main()
{
TestA Temp;
Temp.ModifyArrayNonConst("ABCD");
Temp.ModifyArrayConst("ABCD");
}
const의 오류는 다음과 같은 메시지를 생성합니다.
오류 : 읽기 전용 매개 변수 'Data'감소
주석에 표시된 문제를 일으키고 싶지 않다면 그렇게하고 싶지 않은 것이 좋습니다. const 함수에서 감소를 편집하면 다음이 발생합니다.
비
Const : A Const : B
분명히 A가 'Data [1]'이더라도 NonConst 포인터가 감소 연산을 허용했기 때문에 'Data [0]'으로 취급됩니다. const를 구현하면 다른 사람이 쓸 때 잠재적 버그가 발생하기 전에 잡을 수 있습니다.
또 다른 주요 고려 사항은 참조가 가리키는 것을 변경할 수 없다는 점에서 const 포인터를 의사 참조로 사용할 수 있다는 것입니다 (이것이 어떻게 구현되었는지 궁금 할 것입니다). 치다:
int main()
{
int A = 10;
int * const B = &A;
*B = 20; //This is permitted
printf("%d\n",A);
B = NULL; //This produces an error
}
컴파일을 시도하면 다음 오류가 발생합니다.
오류 : 읽기 전용 변수 'B'할당
A에 대한 지속적인 참조를 원한다면 아마도 나쁜 것입니다. B = NULL
주석 처리 된 경우 컴파일러는 행복하게 수정할 수 *B
있으므로 A를 사용할 수 있습니다. 이것은 int에서는 유용하지 않을 수 있지만 통과 할 수있는 참조 할 수없는 포인터를 원하는 그래픽 응용 프로그램의 단일 자세가 있는지 고려하십시오. 주위에.
사용법은 가변적이지만 (의도하지 않은 말장난을 제외하고) 올바르게 사용하면 프로그래밍을 지원하는 상자의 또 다른 도구입니다.