글수 69
간단한 Linked List 클래스를 만들다가 의문을 갖게 되었습니다.
요런 클래스를 만들 때 일반적으로 자료형을 template으로 지정할텐데요...
예를들어
[code]
template <class T>
class LinkedList {
public:
void Insert(T& value);
...
};
[/code]
뭐 저렇게 해두면, LinkedList<int>::Insert 인 경우...
30 같이 직접 숫자를 넣으면, int를 int &로 바꿀 수 없다는 컴파일 오류가 뜨더군요.
[code]
void test(int& value)
{
printf("test = %d", value);
}
...
test(30); // error C2664: 'test' : 매개 변수 1을(를) 'int'에서 'int &'(으)로 변환할 수 없습니다.
[/code]
그렇다고 T& 대신 T를 쓴다면, 구조체 같이 커다란 뭉텅이를 다루는 경우 손해볼 것 같고...
T&를 쓰면 기본 자료형 같은 놈들은 값을 바로 입력하기가 힘들고...
T형과 T& 형을 모두 두면 컴파일러가 구분을 못 하지요.
궁여지책으로
[code]
template <class T>
class value {
public:
value(T v) { data = v; }
operator T& () { return data; }
private:
T data;
};
[/code]
이런 비참한 걸 만들어놓고 Insert(value<int>(30)); 하는 방법도 생각해봤었으나...
-_-
그런데, 비슷한 클래스인데도 STL에 나온 놈들은 그냥 숫자를 입력해도 잘 되더군요.
차이가 뭘까 해서 살펴보니 STL에 있는 것들은 const가 붙는 겁니다.
그래서 저도 const를 붙여보니 잘 되더군요.
물론 const를 붙여도 일단은 T&이므로, 컴파일러가 스택에 임시 변수를 만들어서 주소를 넘겨주지만...
(전부터 VB에서 말하는 ByRef 로 인자를 넘기면 상수도 그냥 슥슥 넘기길래 어떻게 한 걸까 궁금했는데 VB도 그냥 임시 변수를...)
[code]
void test(const int& value) // const 추가
{
printf("test = %d", value);
}
...
test(30); // OK
[/code]
여튼 제가 추측하기엔 int& 인 경우 30이란 숫자를 넣을 때, 함수 안에서 값을 바꾸는 경우 30이란 상수를 바꾸게 되는 경우가 있으므로 아예 거부하지만,
const int&인 경우는 그런 경우를 생각하지 않아도 되니 그냥 받아들이는 모양이네요.
[code]
T & <= const T // Error
const T & <= const T // OK
[/code]
정말 C++ 하면서 자꾸 느끼는 거지만, C++에서 말하는 const 키워드는 기능이 상당히 많은 것 같습니다...
요런 클래스를 만들 때 일반적으로 자료형을 template으로 지정할텐데요...
예를들어
[code]
template <class T>
class LinkedList {
public:
void Insert(T& value);
...
};
[/code]
뭐 저렇게 해두면, LinkedList<int>::Insert 인 경우...
30 같이 직접 숫자를 넣으면, int를 int &로 바꿀 수 없다는 컴파일 오류가 뜨더군요.
[code]
void test(int& value)
{
printf("test = %d", value);
}
...
test(30); // error C2664: 'test' : 매개 변수 1을(를) 'int'에서 'int &'(으)로 변환할 수 없습니다.
[/code]
그렇다고 T& 대신 T를 쓴다면, 구조체 같이 커다란 뭉텅이를 다루는 경우 손해볼 것 같고...
T&를 쓰면 기본 자료형 같은 놈들은 값을 바로 입력하기가 힘들고...
T형과 T& 형을 모두 두면 컴파일러가 구분을 못 하지요.
궁여지책으로
[code]
template <class T>
class value {
public:
value(T v) { data = v; }
operator T& () { return data; }
private:
T data;
};
[/code]
이런 비참한 걸 만들어놓고 Insert(value<int>(30)); 하는 방법도 생각해봤었으나...
-_-
그런데, 비슷한 클래스인데도 STL에 나온 놈들은 그냥 숫자를 입력해도 잘 되더군요.
차이가 뭘까 해서 살펴보니 STL에 있는 것들은 const가 붙는 겁니다.
그래서 저도 const를 붙여보니 잘 되더군요.
물론 const를 붙여도 일단은 T&이므로, 컴파일러가 스택에 임시 변수를 만들어서 주소를 넘겨주지만...
(전부터 VB에서 말하는 ByRef 로 인자를 넘기면 상수도 그냥 슥슥 넘기길래 어떻게 한 걸까 궁금했는데 VB도 그냥 임시 변수를...)
[code]
void test(const int& value) // const 추가
{
printf("test = %d", value);
}
...
test(30); // OK
[/code]
여튼 제가 추측하기엔 int& 인 경우 30이란 숫자를 넣을 때, 함수 안에서 값을 바꾸는 경우 30이란 상수를 바꾸게 되는 경우가 있으므로 아예 거부하지만,
const int&인 경우는 그런 경우를 생각하지 않아도 되니 그냥 받아들이는 모양이네요.
[code]
T & <= const T // Error
const T & <= const T // OK
[/code]
정말 C++ 하면서 자꾸 느끼는 거지만, C++에서 말하는 const 키워드는 기능이 상당히 많은 것 같습니다...
2007.10.22 14:53:58 (*.218.236.200)
이건 프로그래밍할 때의 간단한 팁같은건데
인자를 사용할 때는 "함수 내부에서 인자를 변경시킬 필요가 없는 경우, 즉, [IN] 타입일 때에는 const T&를 사용합니다.
그게 아니고 "함수 내부에서 인자를 변경시킬 필요가 있는 경우, 즉, [OUT] 타입일 때에 T&를 사용하지요..
상수 30은 const int이기 때문에 값을 변경시킬 수 있는 T&로는 넣을 수가 없었던 것입니다.
값을 변경시킬 필요가 없다면 되도록 const T&를 사용하는 버릇을 들여두시는게 좋은 것 같습니다^^
인자를 사용할 때는 "함수 내부에서 인자를 변경시킬 필요가 없는 경우, 즉, [IN] 타입일 때에는 const T&를 사용합니다.
그게 아니고 "함수 내부에서 인자를 변경시킬 필요가 있는 경우, 즉, [OUT] 타입일 때에 T&를 사용하지요..
상수 30은 const int이기 때문에 값을 변경시킬 수 있는 T&로는 넣을 수가 없었던 것입니다.
값을 변경시킬 필요가 없다면 되도록 const T&를 사용하는 버릇을 들여두시는게 좋은 것 같습니다^^

int& 가 리터럴 상수를 싫어 한다는 것은 참으로 신기하내요.