레퍼런스와 const에 관한 기초적인 질문입니다.
글쓴이: nidle / 작성시간: 일, 2003/11/09 - 4:35오후
제가 책을 보면서 공부하다가 이해가 안되는부분이있어서요
"
--> int &max(int a,int b){return (a>b)?a:b;}
형식인자들은 함수 블록이 끝나면 소멸되기때문에 값으로 넘어온 것을
레퍼런스로 넘기려면 const키워드를 써야된다.
const int &max(int a,int b){return (a>b)?a:b;} " <----
이렇게 나와있는데요 위의상황에서 레퍼런스쓰면 안된다는것은알겠는데
const를 사용하면 된다는게 그냥 형식이라면 외우겠지만..
먼가 const의 기능이 있는거라면 왜 const를사용하면 되는건지 알려주세요
아 그리고 하나만더요
어떤책은 const를 const int &max(int a,int b){return (a>b)?a:b;}
이렇게 int 앞에다쓰고
다른책은 int getx() const {return x;}이렇게 const를 ()뒤에다쓰는데
차이가없는건가요,,,
그럼이만.. ^^
Forums:
일단 C++ 군요.
우선
이건 모르겠군요.
const 는 형 한정어(제 기억이 맞다면 영어로 type qualifier)의 하나로 아는데 여기서 한정이란 수식이란 말과 같은 것 같습니다. 자연언어 문법으로 따지면 형용사죠. 그래서인지 형 지정자(type specifier, 즉 int, double 같은 것) 를 명사로 볼 때 수식하는 명사 앞에 오는 것이 기본입니다.
getx 는 nidle 씨가 만든 name(이것도 programming language 문법에 관한 용어) 인데 name 뒤에 오는 것은 처음봅니다. C++ 니까 만약 이것이 class 의 member 함수라면 이유가 있습니다만 그냥 전역에 선언된 함수라면 저도 처음 보는 군요. 아마도 함수 이름이 getx 인 것으로 봐서 객체의 member x 의 값을 얻기 위한 member 함수인 것 같군요.
다만 const 가 수식하는 형 지정자 뒤에 오는 것은 가끔 봅니다.
즉
int const [name]
같이 쓰는 것을 말하는데 지금은 어떤지 모르겠습니다만 예전에 GCC 가 경고나 오류를 보고할 때 저렇게 쓰더라구요.
이것은 수식하는 것이 name 으로 본다면 충분히 이해가 갑니다.
사실 변경불가가 되는 것은 name 이지 형 지정자가 아니지 않습니까?
특히 pointer 와 관련해서 상수 포인터 상수를 표현할 때 저는
int const * const [name]
이const int * const [name]
보다자연스럽게 보입니다.
하지만 Visual C++ 6 에서는 형 지정자 뒤에 const 를 쓰는 것을 표준에 맞지 않는 방식이라고 경고하더군요.
그리고 표준문서 봐도 형 한정어들은 형 지정자 앞에 오더군요.
쓸데없는 소리가 길었군요. 궁금하신 바에 대해서 이야기 하자면
이것도 nidle 씨가 처음에 쓰신 code 와 같은 이유로 틀렸습니다.
return 형이 참조형이 불가능한 이유는 const 와는 상관이 없습니다.
옳게 쓰실려면 형식인자들을 참조형으로 바꿔야 합니다.
즉
int &max(int &a,int &b){return (a>b)?a:b;}
가 되어야 합니다.
return 된 값은 a 혹은 b 가 됩니다.
만약
int c = max(a, b)
라면 상관없습니다만int & c = max(a, b)
가 된다면c 를 바꿨을 때 a 혹은 b 중 큰 놈이 따라 바뀔 겁니다.
이것을 막기 위해서는 max 의 return 형을 const 참조형으로 바꾸면 참조형으로 받을 때 역시 const 참조형으로만 받을 수 있기 때문에 a, b 는 변경하지 않게 할 수 있습니다.
Re: 일단 C++ 군요.
메소드에 const가 붙는 건 그 메소드가 호출객체(즉, this)를 변경하지 않을것을 명확히 하는 것입니다. 내부에서 호출객체의 어떤 멤버값의 변경이 있을경우 컴파일러 에러가 발생(즉 문법적인 오류가 되는거죠)합니다.
이러한 형태의 문법이 필요한 경우가 있는데..
예를 들어 const형으로 생성한 객체인 경우.. 이 객체의 값이 초기 주어진 값이외에는 변경되어선 안됩니다. 따라서 객체의 메소드 호출시 메소드가 객체를 변경시키지 않는다는 보장이 있어야 하는데.. 메소드형에 const는 이를 위한 문법인 것입니다.
제가 말주변이 없는 관계로 나머지는 책을 참조하시길.. ㅡㅡ;;
C++문법을 제대로 공부하고 싶으시면 'C++기초플러스'(성인당)(원서로는 C++ PRIMER PLUS, Setphen Prata저)를 보시면 아주 좋습니다. 제가보기엔 질문하신분이 지금 봐야할 가장 적절한 책인듯 싶네요.
const난 reference 관련된 내용도 이책을 보시면 명확히 그 효과를 아실수 있을 겁니다.
위의 내용은 정확히 495페이지에 설명되어 있군요.(제건 번역판입니다.(제3판))
Re: 일단 C++ 군요.
답변 감사합니다.. 매번 큰 힘이 되는군요,,,,꾸벅 ^^
그렇다면..
const int &max(int a,int b){return (a>b)?a:b;}또한 잘못된
표현이군요,, 책에서는 바른 표현이라고 해서 저도 의문이었습니다.
답변감사합니다 저도 빨리 여기 있는 질문에 답변할 수 있는 날이
빨리왔으면 좋겠네요,,^^
댓글 달기