'const'에 해당되는 글 1건
- 2010.04.02
코딩 하다보면 const 를 사용해야 하는 경우가 있다.
그러나 정확하게 기억나지 않아서 좀 헷갈리고, 결국 안 쓰고 넘어가게 된 적이 몇 번 있다ㅠㅠ
이런 저질 기억력...
첫번째 컨닝 페이퍼다.
constant 의 약자이다.
const int val = 10;
int const val2 = 20;
위의 코드는 동일한 동작을 한다.
2. 포인터 변수에서의 const
char aBuf[10];
char bBuf[10];
const char * ptrBuf1 = aBuf; // char const * ptrBuf1 = aBuf; 와 같다
char * const ptrBuf2 = aBuf;
*ptrBuf1 = 'a'; // 에러
ptrBuf1 = bBuf; // 성공
*ptrBuf2 = 'a'; // 성공
ptrBuf2 = bBuf; // 에러
*(포인터 기호?) 을 기준으로 ptrBuf1은 포인터 변수이므로 포인터 주소 값을 변경할 수 있지만, 데이터 형이 const형이므로 주소가 가르키는 실제 값을 바꿀 수는 없다.
ptrBuf2 역시도 * 을 기준으로 const 포인터 변수이므로 포인터 주소 값을 변경할 수는 없지만, 데이터형의 값은 바꿀 수 있다.
추가적으로 const char * const pBuf = aBuf; 처럼 주소와 주소가 가르키는 값 모두 const로 만들 수도 있다.
아...이래도 헷갈린다 ㅠㅠ
3. 일반 변수와 const 변수
int num = 10;
const int * const pNum = # // 성공
const int num = 10;
int * pNum = # // 에러
const로 선언된 변수의 주소는 일반 포인터 변수에 대입할 수 없다.
4. 참조와 const
int num = 10;
int const &refNum = num;
refNum = 20; // 에러
num = 20; // 성공
const 참조 변수는 직접적으로 값을 변경 할 수 없지만, 원본을 통해서는 변경할 수 있다.
int & const refNum2 = num;
refNum2 = 20;
이 경우는 컴파일시에 참조가 무시된다.(vc2005 기준)
5. 함수와 const
const int func() // 이건 무의미하다.
const int * func() // 상수화된 int 포인터 주소를 리턴
int * const func() // 위와 같음
int const & func( const int * arg ) // 상수화된 참조형식으로 리턴
6. class 와 const
6-1. 맴버함수 뒤에 붙는 const
class TestClass
{
public:
TestClass() { num = 100; } // 100으로 초기화
int func() const;
int func(){ num = 2; return num; }
int func2(){ num = 10; return num; }
int func3() const { return num; }
protected:
int num;
};
int TestClass::func() const
{
int a = 1;
int b = a++;
num = b; // 에러
return num;
}
class의 맴버 함수 정의 뒤에 const가 붙으면, 해당 함수 내부에서 해당 클래스의 맴버변수를 변경할 수 없다.
6-2. 객체에 붙는 const
const TestClass test;
int num = test.func(); // const func() 함수가 호출됨.
test.func2(); // 에러
TestClass test2;
int num2 = test2.func(); // func() 함수가 호출됨.
test2.func3(); // 성공
cout << "num : " << num << endl << "num2 : " << num2 << endl;
결과
num : 100
num2 : 2
const 객체는 const 맴버 함수만 호출 할 수 있고, 함수 오버로딩 된 경우도 const 함수가 호출된다.
비 const 객체는 const 함수를 호출 할 수 있다.
7. cast
const num = 10;
num = 20; // 에러
int * num2 = const_cast<int*>(&num);
상수형 포인터를 비 상수형 포인터로 변경할 때 사용된다.
const 는 가급적 변경하지 않는게 바람직 하다.
간혹 함수의 비 상수형 인자로 상수형 변수를 전달하여야 할 경우에 사용된다.
글의 내용이 100% 정확하다고는 못 하겠다. 참고한 책이 좀 오래된 책이기도 하고.. 생각 나는데로 작성한 것이기도 하고...
시간내서 검증좀 해보고 수정이 필요하면 수정 하고 뭐 더 추가할 만한게 있나 생각해보고 있으면 추가도 해야겠다.
p.s. 또 6시 넘었다. 퇴근!!
postgreSQL 에서 oracle의 rowid 같은 값 이용하기 (0) | 2011.02.18 |
---|---|
참조카운팅과 String (0) | 2010.04.26 |
메모리 지정 new(placement new) (0) | 2010.04.12 |
parameter & argument (0) | 2010.04.09 |
Prologue... (0) | 2010.04.01 |