객체도 상수화할 수 있다.

const instance ist(20);

이렇게 객체에 const 선언을 붙이게 되면, 이 객체를 대상으로는 const method 만 호출이 가능하다. 이는 객체의 const 선언이 다음의 의미를 갖기 때문이다.

"이 객체의 데이터 변경을 허용하지 않겠다."

때문에 const method 만 호출이 가능한 것이다. 


※ 멤버 변수에 저장된 값을 수정하지 않는 함수는 가급적 const로 선언해서, const 객체에서도 호출이 가능하도록 할 필요가 있다. 


const 와 함수 오버로딩

함수 오버로딩이 성립하려면 매개변수의 수나 자료형이 달라야 한다. 하지만 다음과 같이 const의 선언유무도 함수 오버로딩의 조건에 해당이 된다.

void simple() {    }

void simple() {    } const




'Programming > C++' 카테고리의 다른 글

getopt Function Example  (0) 2013.09.25
qsort Function Example  (0) 2013.09.25
복사 생성자의 완벽한 이해  (0) 2013.08.12
3n+1 문제  (0) 2013.03.27
List 자료구조로 만든 프로그램  (0) 2013.03.20
Posted by scii
:

const 키워드

Programming/C 2013. 2. 15. 02:38 |

int num = 5;

int* ptr = #


포인터 ptr의 선언에서 const가 들어갈 수 있는 위치.

const int* const ptr = #


포인터 선언 앞 부분에 const가 삽입될 수도 있고, 포인터 변수의 이름 앞에 const가 삽입될 수도 있다.

이 둘은 다른 의미를 지닌다.

필요하다면, 두 군데 모두에 const를 삽입 할 수도 있다. 


ⓐ 포인터 앞에 있는 const의 의미.

 int num = 5;

 const int* ptr = #


이렇게 선언이 되면 포인터 ptr은 다음과 같이 가리키는 대상에 대한 값의 변경이 허용되지 않는다.

*ptr = 20; //컴파일 에러 발생.




즉, const 선언이 앞에 있을 경우 포인터를 이용한 값의 변경을 허용하지 않겠다는 뜻이 된다.

※ 포인터를 이용한 값의 변경만을 허용하지 않을 뿐이다. 변수가 상수가 되는 건 아님.


한마디로, 포인터의 선언 앞에 const가 붙으면, 이 포인터를 이용해서는 값의 참조만 가능할 뿐 변경은 불가능!




ⓑ 변수 이름 앞에 있는 const의 의미.

int num = 10;

int* const ptr = #


이 선언은 포인터 변수 ptr을 상수화시킨다는 의미이다. 즉 포인터 변수 ptr에 저장된 값의 변경이 불가능해지는 것이다. 포인터 ptr은 끝까지 변수 num만 봐라보며 가리킨다. 해바라기




포인터와 관련된 두가지 형태의 const 선언은 각각 별개의 선언이다. 서로 별개의 선언이기 때문에 다음과 같이 선언하는 것도 가능하다.


int num = 10;

const int* const ptr = #

이렇게 선언된 포인터 변수 ptr은 두 가지 제약사항이 동시에 생기게 된다.


ⓐ 포인터 ptr을 이용해서는 ptr이 가리키는 변수의 저장된 값을 변경할 수 없다.

ⓑ 포인터 ptr은 끝까지 변수 num만 가리켜야 한다. ptr상수화


Posted by scii
:

const 객체와 const 객체의 특성


객체도 상수화할 수 있다.

const Simple sim(2);


그리고 이렇게 객체에 const 선언이 붙게 되면, 이객체를 대상으로는 const 멤버함수만 호출이 가능하다. 이는 객체의 const 선언이 다음의 의미를 갖기 때문이다.

"이 객체의 데이터 변경을 허용하지 않겠다!"


물론 const로 선언되지 않은 함수 중에도 데이터를 변경하지 않는 함수가 있을 수 있다. 하지만 변경시킬 능력이 있는 함수는 아예 호출을 허용하지 않는 것이다.




멤버변수에 저장된 값을 수정하지 않는 함수는 가급적 const로 선언해서, const객체에서도 호출이 가능하도록 할 필요가 있다. const 선언은 많을수록 좋다.






const와 함수 오버로딩


: 함수의 오버로딩이 성립하려면 매개변수의 수나 자료형이 달라야 한다. 하지만 다음과 같이 const의 선언유무도 함수 오버로딩의 조건에 해당이 된다.


void SimpleFunc() {...}

void SimpleFunc() const {...}




'Programming > C++' 카테고리의 다른 글

C++에서의 static  (0) 2012.05.30
friend  (0) 2012.05.26
복사 생성자의 호출시점  (0) 2012.05.25
깊은 복사 & 얕은 복사  (0) 2012.05.24
explicit  (0) 2012.05.23
Posted by scii
:

const 함수

Programming/C++ 2012. 5. 8. 03:01 |

int GetX(void) const;

int GetY(void) cosnt;

void Show(void) cosnt;


이 const가 의미하는 바는 "이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다!" 라는 뜻이된다.


매개변수도 아니고, 지역변수도 아닌 멤버변수에 저장된 값을 변경하지 않겠다는 선언이다. 따라서 const 선언이 추가된 멤버함수 내에서 멤버변수의 값을 변경하는 코드가 삽입되면, 컴파일 에러가 발생한다. 


이렇게 함수는 cosnt로 선언하면, 실수로 자신의 의도와 다르게 멤버변수의 값을 변경했을 때, 컴파일 에러를 통해서 이를 확일할 수 있다. 



const 함수의 또 다른 특징 



const 함수 내에서는 const가 아닌 함수의 호출이 제한된다!!!


const로 선언되지 않은 함수는 아무리 멤버변수에 저장된 값을 변경하지 않더라도, 변경할 수 있는 능력을 지닌 함수이다. 따라서 이러한 변경이 가능한 함수의 호출을 아예 허용하지 않는 것이다.




InitNum 함수의 매개변수 ea는 'const 참조자'이다. 그런데 이를 대상으로 GetNum함수를 호출하면 컴파일 에러가 발생한다. 이는 GetNum이 const 함수가 아니기 때문이다.

const 참조자를 이용해서는 const 함수만 호출이 가능하다.

'Programming > C++' 카테고리의 다른 글

생성자(Constructor)  (0) 2012.05.12
캡슐화  (0) 2012.05.12
정보은닉(Information Hiding)  (0) 2012.05.03
Message Passing  (0) 2012.05.02
클래스 기반의 두 가지 객체생성 방법  (0) 2012.05.02
Posted by scii
: