c++ const 함수와 레퍼런스 반환
글쓴이: wans038 / 작성시간: 목, 2016/01/28 - 1:58오전
안녕하세요.
질문이 너무 초보적인거 이해부탁드립니다. 꾸벅(__)
c++ 연산자 오버로딩 공부하면서 다시 생각해보게 됬는데요.
질문을 아주아주 간단히 하면 제가 연산자 오버로딩 공부하기 전에는 반환값 상관없이 "const 함수에서는 멤버 변수를 건들지 않겠다" 이렇게 생각 했는데 연산 오버로딩 공부를 하고 다시 생각해봤는데
const 함수는 반환값에도 제한을 두고 있었군요. 근데 한가지 의문점이 드는데
#include <iostream> using namespace std; class IWANTU { private: int* pArr; int normalArr[10]; int* pNormalArr = normalArr; // pNormalArr이 가르키는 멤버는 객체에 있는 멤버 public: IWANTU() { cout << "생성자 " << this << endl << endl; pArr = new int[10]; memset(pArr, 0, 40); memset(normalArr, 0, sizeof(normalArr)); } /* const 함수 즉 이 함수에서 멤버변수의 값이 바뀌면 안된다, 그래서 반환 값이 멤버를 참조할 수 있는 값이 반환된다면 다른 함수에서 값이 변경될수 있으므로 이 함수에서는 어떻게 해서든 멤버변수값이 바뀌면 안되므로 const 함수에서 멤버변수의 참조값을 넘기는 것을 허용하지 않겠다! 반환형이 const int&는 당연히 int&로 받지 못하기 떄문에 const int&는 허용! */ const int& normalArrReturn(void) const { return normalArr[0]; } /* int* pArr으로 선언하면 pArr이 가리키는 대상은 엄밀히 객체의 멤버가 아닌 객체의 멤버가 가리키는 것일뿐이지만.. normalArr은 배열 모든요소가 객체의 멤버여서 normalArrReturn 함수에서 int&으로 반환할 경우 에러가 발생된다 */ int& pArrReturn(void) const { return pArr[0]; } /* 가르키는 대상이 객체 멤버인데... 왜 에러안나지... */ int& WhyNot(void) const { return pNormalArr[0]; } void Information(void) const { for (int i = 0; i < 10; i++) cout << pArr[i] << endl; endl(cout); for (int i = 0; i < 10; i++) cout << normalArr[i] << endl; endl(cout); } }; int main(int argc, char** argv) { IWANTU yes; yes.Information(); int& tt = yes.WhyNot(); tt = 5000; yes.Information(); return 0; }
이런 코드를 작성했는데 왜... WhyNot const 함수에서 왜 오류가 안날까요...?
객체의 멤버가 가르키는 그리고 가르키는 대상도 모두 멤버 변수인데... 제가 달아 놓은 주석에 따르면 오류를 뿜어야 하지 않나요...?
(__) 꾸벅
Forums:
1. int의 크기는 4로 고정되어있는 것이 아니기
1. int의 크기는 4로 고정되어있는 것이 아니기 때문에 40이라는 하드코딩하는 것 보다 sizeof로 대체하는것이 좋습니다.
2. WhyNot 함수의 경우, 리턴이 pNormalArr와 관련되어 있죠?
pNormalArr값 자체를 리턴할 경우 에러를 낼 것 같습니다. 멤버 값을 변경할 수 있는 여지가 있으니까요.
하지만 pNormalArr[0]의 경우 참조값이기 때문에 멤버변수가 아니잖아요?
(물론 이 코드상에서는 멤버변수가 맞습니다만, 일반적으로 멤버변수라고 단정지을 수 없죠)
감사합니다!
class* Ref = new TEST();
실제 가르키는 대상을 모르듯이, 그런거군요!
감사합니다.
한 가지 더..
저도 초보자지만 위엣 분 말이 맞다는 것에 의견을 실어주는 부분을 하나 더 달자면..
int* pNorma... ->
const int * pNorma.. 로 하면 반환이 안 됩니다.
댓글 달기