시작...

블로그 이미지
mutjin

Article Category

분류 전체보기 (148)
기록 (3)
개발새발 (8)
2010년 이전 글 (133)

Recent Post

Recent Comment

Recent Trackback

Calendar

«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Archive

My Link

  • Total
  • Today
  • Yesterday
  1. 2010.04.02
    const 정리


코딩 하다보면 const 를 사용해야 하는 경우가 있다.
그러나 정확하게 기억나지 않아서 좀 헷갈리고, 결국 안 쓰고 넘어가게 된 적이 몇 번 있다ㅠㅠ
이런 저질 기억력...

첫번째 컨닝 페이퍼다.


constant 의 약자이다.



C 에서의 const는 전처리 단계에서 상수라기 보단 읽기 전용 변수로 취급하기 때문에 define 과 같은 의미로 사용할 수 없지만 C++ 에서는 완전한 상수로 취급하므로 define을 대체해서 사용할 수 있다.
즉, 배열의 열 갯수로 사용 할 수 있다는 얘기다.


1. 일반 변수에서의 const

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. classconst

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
and