[완료] (다시질문) 배열의 내용이 변경되지 않게 하려면..
글쓴이: hugeval / 작성시간: 목, 2009/07/09 - 2:32오전
며칠 전 드린 질문과 같은건데요
class ARRAY
{
public:
int arr1[100];
int* arr2;
ARRAY(){
arr2=NULL;
arr2 = new int[100];
};
~ARRAY(){
if( arr2 ) delete[] arr2;
};
void a1() { arr1[0] = 10; };
void a2() { arr2[0] = 10; };
};
void func(const ARRAY* Array)
{
Array->arr1[0] = 10; // 1 에러
Array->a1(); // 2 에러
Array->arr2[0] = 10; // 3 정상
Array->a2(); // 4 에러
}
int _tmain(int argc, _TCHAR* argv[])
{
ARRAY Array;
func(&Array);
return 0;
}
arr2는 동적할당한 배열입니다
위에 func 보시면 1,2,4는 예상대로 에러 납니다
근데 3에서는 문제가 없더군여
arr2가 동적할당한 배열이라서 그런건가요?
왜 3에서는 에러가 안나는건지를 알고싶습니다ㅠ
Forums:
re: ...
우선 1번과 2번이 에러가 나는 이유가 틀린 부분을 이해를 하셔야 할듯합니다.
1번은 const ARRAY* Array 가 const 인스턴스 이므로 멤버에 대해서 수정 불가 에러..
2번은 a1() 함수가 const 한정자가 붙은 버전의 함수가 없으므로 컴파일 에러가 발생한 것입니다.
2번을 애초 의도(?) 대로 멤버에 대한 수정 불가 에러를 발생 시키시려면 a1() 함수에 대해서 const 한정자를 붙이셔야 합니다.
void a1() const { arr1[0] = 10; };
이렇게 하면 비로서 멤버에 대해서 수정 불가 에러는 발생 합니다.
4번의 경우도 위의 2번의 경우와 같이 적용 되는것이고,
3번의 경우 에러가 안나는 이유는 포인터변수의 자체값, 그러니까 주소값을 변경 한것이 아니고
그 주소가 가르키고 있는 값을 변경을 했기 때문에 문제가 없는것입니다.
만약 Array->arr2 = NULL; 하셨다면 원하시는 에러는 발생 시켰을 것입니다.
위의 결과대로 4번의 경우도 const 버전의 함수가 제공된다면 에러를 발생하지 않습니다.
void a2() const { arr2[0] = 10; };
Array->a2(); // 4 성공..
--
cdecl
--
cdecl
const char* p 와 char* const q의 차이점
을 이해해야합니다. 추가로 객체가 const로 선언되었을 때 멤버에 적용되는 규칙을 알아보세요.
:)
음..
일단 답변 감사합니다^^
1번과2번이 다른이유로 에러가 발생한거였군요.
근데 const ARRAY* Array는 Array가 가리키는
객체의 내용을 변경할수없는것인데
멤버포인터 arr2가 가리키는 동적할당한 배열의 내용도 변경이 안되야할텐데
왜 에러가 안나는지가 궁금한거거든요
3번은 arr2의 주소값을 변경하려는게아니라
1번과 똑같이 배열요소를 변경하는거거든요.
그래서 정적할당한 배열과 동적할당한 배열이라는 차이점때문에
에러가 나고 안나는건가 궁금했습니다.
const char* p와 char* const q 차이점은
첫번째는 p가 가리키는 객체의 내용을 변경할수없는것이고 다른객체를 가리킬순있습니다
두번째는 p의 주소값을 변경할수없기때문에 다른객체를 가리킬수없다는걸로 알고있습니다
대신 가리키는 객체의 내용은 변경할수있습니다
아닌가요?
멤버가 배열일 경우
const 로 객체를 한정했을 때
멤버가 배열이면 배열 요소 하나 하나가 const로 한정되는 효과르 갖습니다.
포인터라면 포인터만 한정되죠. 즉 char* const arr2와 같아집니다.
기본복사생성자도 멤버가 배열이면 배열의 요소 하나하나를 다 복사해주는 등, 배열에 대해 특별한 처리를 해주는 경우가 있습니다.
:)
네 답변감사 합니다
멤버변수가 포인터인경우에는 포인터변수만 해당하는거군요~
그렇다면 멤버포인터가 가리키고있는 배열까지도 변경되지 않게 할수는 없나요?ㅋ
std::vector를
std::vector를 이용하세요.
첨에 벡터 썼었는데요
첨에 vector 썼다가 디버깅이 어려워서
int 배열쓰는건데요
흠.. 좀더 고민을 해봐야겠습니다
답변 감사합니다!
댓글 달기