글수 49
const에 대해 정리해봤습니다. 약간 불명확한 부분이 있을수도 있겠네요.
const는 변수, 포인터형, 참조형, 함수, 클레스 등에 붙을수 있음.
1. 변수
예)
const i = 100;
i 값 변경불가
2. 포인터형 : 기본적으로 2가지 형태가 있을 수 있음. 그외 여려형태가 가능
예1) 값은 변경 불가능하지만 주소는 변경가능한 형태
int temp = 100, temp2 = 200;
const int *ipConst = &temp; // *ipConst 값 변경 불가, ipConst(주소)값은 변경가능
// int const *ipConst = &temp; // 이런형태로 써도 위와 같은 의미
// *ipConst = 300; // 불가능한 형태
ipConst = &temp2; // 가능한 형태
예2) 주소는 변경 불가능하지만 값은 변경가능한 형태
int temp = 100, temp2 = 200;
int * const iConstp = &temp; // *iConstp 값 변경 가능, iConstp(주소)값은 변경불가
*iConstp = 300; // 가능한 형태
//iConstp = &temp2; // 불가능한 형태
주의 : const가 결합되는 위치가 값인지 주소인지에 유의
3. 참조형
예1) 직접적으로 값과 주소 모두 변경 불가능하지만 참조 원본을 통한 값변경은 가능한 경우
int temp3 = 100, temp5 = 200;
int const &ircVal = temp3;
//ircVal = 2000; // 컴파일 에러 발생 (const 참조는 값 변경불가)
//ircVal = temp5; // 주소도 변경불가
temp3 = 9000; // 참조 원본은 변경가능, 결과적으로 ircVal의 값도 변하게됨
예2) 직접적으로 값과 주소 모두 변경 가능하지만 참조가 가르키는 값은 변화가 없는경우
int temp4 = 300, temp5 = 500;
int & const icrVal = temp4;
icrVal = 6000; // 값변경 가능, 하지만 값에 변경이 안됨
cout << " icrVal " << icrVal << endl; // 여전히 300이 찍힘
icrVal = temp5; // 주소도 변경가능 역시 값에 변경이 안됨
cout << " icrVal " << icrVal << endl; // 여전히 300이 찍힘
4. 함수 : class의 멤버함수인 경우만 const 함수 사용가능. 해당 class의 멤버변수를 변경할수 없음.
예)
class ConstTest
{
public:
int m_iA;
ConstTest()
{ m_iA = 1; }
int const_func1( int &a_iA, int &a_iB) const
{
int a = 1;
int b = 2;
int c = 0;
c = a + b;
a_iA += 100;
// m_iA += 100; // 에러발생. 멤버변수는 변경 불가
return m_iA;
}
};
5. 클레스
예)
const CMyConstClass CC;
// 내부 멤버변수 전체를 변경불가능한 클레스,(생성자 함수만은 예외)
// 모든 내부 멤버 함수는 기본적으로 const 함수가 되야만함.
// 내부 함수의 지역 변수및 인자로 받은 변수는 변경가능.
const는 변수, 포인터형, 참조형, 함수, 클레스 등에 붙을수 있음.
1. 변수
예)
const i = 100;
i 값 변경불가
2. 포인터형 : 기본적으로 2가지 형태가 있을 수 있음. 그외 여려형태가 가능
예1) 값은 변경 불가능하지만 주소는 변경가능한 형태
int temp = 100, temp2 = 200;
const int *ipConst = &temp; // *ipConst 값 변경 불가, ipConst(주소)값은 변경가능
// int const *ipConst = &temp; // 이런형태로 써도 위와 같은 의미
// *ipConst = 300; // 불가능한 형태
ipConst = &temp2; // 가능한 형태
예2) 주소는 변경 불가능하지만 값은 변경가능한 형태
int temp = 100, temp2 = 200;
int * const iConstp = &temp; // *iConstp 값 변경 가능, iConstp(주소)값은 변경불가
*iConstp = 300; // 가능한 형태
//iConstp = &temp2; // 불가능한 형태
주의 : const가 결합되는 위치가 값인지 주소인지에 유의
3. 참조형
예1) 직접적으로 값과 주소 모두 변경 불가능하지만 참조 원본을 통한 값변경은 가능한 경우
int temp3 = 100, temp5 = 200;
int const &ircVal = temp3;
//ircVal = 2000; // 컴파일 에러 발생 (const 참조는 값 변경불가)
//ircVal = temp5; // 주소도 변경불가
temp3 = 9000; // 참조 원본은 변경가능, 결과적으로 ircVal의 값도 변하게됨
예2) 직접적으로 값과 주소 모두 변경 가능하지만 참조가 가르키는 값은 변화가 없는경우
int temp4 = 300, temp5 = 500;
int & const icrVal = temp4;
icrVal = 6000; // 값변경 가능, 하지만 값에 변경이 안됨
cout << " icrVal " << icrVal << endl; // 여전히 300이 찍힘
icrVal = temp5; // 주소도 변경가능 역시 값에 변경이 안됨
cout << " icrVal " << icrVal << endl; // 여전히 300이 찍힘
4. 함수 : class의 멤버함수인 경우만 const 함수 사용가능. 해당 class의 멤버변수를 변경할수 없음.
예)
class ConstTest
{
public:
int m_iA;
ConstTest()
{ m_iA = 1; }
int const_func1( int &a_iA, int &a_iB) const
{
int a = 1;
int b = 2;
int c = 0;
c = a + b;
a_iA += 100;
// m_iA += 100; // 에러발생. 멤버변수는 변경 불가
return m_iA;
}
};
5. 클레스
예)
const CMyConstClass CC;
// 내부 멤버변수 전체를 변경불가능한 클레스,(생성자 함수만은 예외)
// 모든 내부 멤버 함수는 기본적으로 const 함수가 되야만함.
// 내부 함수의 지역 변수및 인자로 받은 변수는 변경가능.
2004.04.06 00:02:11 (*.203.90.184)
제가 잘못한건지.. vc++6.0 으로 참조형의 두번째 예제를 했을때
값이 변경이 되어나왔습니다. 컴파일러에 따라서 다른가요?
값이 변경이 되어나왔습니다. 컴파일러에 따라서 다른가요?
2004.07.01 14:32:30 (*.247.220.118)
음...잘 몰라서 그런데요...
3. 참조형에서
예2) 직접적으로 값과 주소 모두 변경 가능하지만 참조가 가르키는 값은 변화가 없는경우 라고 하셨는데용...
여기서 주소는 어떤 주소를 말하는건가용?
제가 알기로는 참조형은 원본의 주소 값을 가리키고 있고 한번 참조한 참조형 변수는 또 다른 변수를 참조하려고 하면 에러 나는걸로 알고 잇는데, 혹시 제가 저 글을 잘못 이해하고 있나용?
아니면 제가 잘못 알고 있나용?
int temp4 = 300, temp5 = 500;
int & const icrVal = temp4;
icrVal = 6000; // 값변경 가능, 하지만 값에 변경이 안됨
이렇게 하면 Visual 6.0에서는
anachronism used : qualifiers on reference are ignored
라는 워링 메세지 1개가 뜨네용....
3. 참조형에서
예2) 직접적으로 값과 주소 모두 변경 가능하지만 참조가 가르키는 값은 변화가 없는경우 라고 하셨는데용...
여기서 주소는 어떤 주소를 말하는건가용?
제가 알기로는 참조형은 원본의 주소 값을 가리키고 있고 한번 참조한 참조형 변수는 또 다른 변수를 참조하려고 하면 에러 나는걸로 알고 잇는데, 혹시 제가 저 글을 잘못 이해하고 있나용?
아니면 제가 잘못 알고 있나용?
int temp4 = 300, temp5 = 500;
int & const icrVal = temp4;
icrVal = 6000; // 값변경 가능, 하지만 값에 변경이 안됨
이렇게 하면 Visual 6.0에서는
anachronism used : qualifiers on reference are ignored
라는 워링 메세지 1개가 뜨네용....

값과 주소 모두 변경불가 시키는게 ...