explicit 키워드에 대해서.
그닥.기억이안나는군...정말.내가적은게.맞나..ㅡㅡ;..
이녀석은 비야네 형님이 처음부터 만든 녀석이 아닙니다.
98즘에 여러 다른 녀석들과 함께 추가된 녀석입니다.
이녀석은 단일 인자를 갖는 생성자가 자동 형변환이 일어나는 것을 막을수 있습니다.
이것은 일종의 권한이라고 말할 수 있습니다.
보통은 컬파일러가 허용되는 한도내에서 암묵적으로 형변환을 해주어컴파일을 하게 됩니다.
컴파일러는 똑똑한 녀석입니다.
프로그래머의 의도를 파악하려 한다기 보다는 어떻게든 소스를 컴파일 하여
실행하도록 만들려고 모든 수단을 동원하는 녀석이죠.
그렇다면 이녀석이 머하는 녀석인 줄은 알겠는데 왜 추가되었는지에 대해서도
알아야 하지 않을까요?
C언어는 위대합니다.
아주 오래전, 그러니까 객체지향 프로그래밍이 유행하기 이전에는 절차적 프로그래밍이
유행했었습니다.
이에대한 선두주자가 C언어였었죠.
C 언어의 강력함은 누구나 알고있을 겁니다.
이러한 강력함을 만들어 주는 특징 중 하나가 바로 제어권 입니다.
C언어는 제어력이 좋고 제한이 없기 때문에 프로그래머의 생각을 마음껏
표현할 수 있다는 점이 있지만 그만큼 오류를 범할 일도 많다는 겁니다.
그래서 C++로 넘어오면서 일종의 장치를 만들게 되었죠.
이의 목적은 프로그래머에게 컴파일러가 알려줄 수 있도록 시스템을 마련하는 것이었습니다.
그래서 이러한 권한은 컴파일러에게 많이 넘어가 버렸고 지금도 충분히 느끼시겠지만
컴파일러는 갈수록 똑똑해 졌습니다.
아무튼 이러한 노력의 증거품이 define를 inline화 하자 일 겁니다.
누구나 알듯이 define는 전처리기가, inline는 컴파일러가 처리해 줍니다.
즉, 에러가 발생한다면 inline는 컴파일러가 이를 집어 줄수 있다는 거죠.
프로그래머가 미처 신경쓰지 않는 부분까지 해결해 주기 때문에 무척 편해졌죠.
시키지 않은 일을 하여 버그를 만들어 내기 전까지는요.
그래서 프로그래머의 자율성을 존중하는 뜻에서 프로그래머가 반드시 구현해야 하는것이 아니라
필요에 의해 프로그래머가 직접 구현할 수 있도록 만들게 하는 장치가 만들어 졌죠.
그중 하나가 explicit입니다.
이것이 explicit의 탄생 배경입니다.
이녀석의 사용방법에 대한 한 예를 보자면..
#include <iostream.h>
#include <string.h>
class X {
private:
int age;
char name[80];
public:
explicit X(int); //생성자 앞의 explicit은 함축적 변환을 방지한다.
explicit X(const char*, int = 0);
// explicit 키워드는 파라미터가 1개인 생성자에만 사용될 수 있다는 사실에 주의하라.
// 만약 두 번째 파라미터 int가 디폴드 값을 가지지 않는다면, explicit은 문법 에러이다.
};
X::X(int a) {
age=a;
cout << "construct X(int) = " <<a<< endl;
}
X::X(const char* n,int a) {
strcpy(name,n);
age=a;
cout << "construct X(const char*,int)" << endl;
}
void main() {
X a = X(1); //construct X(int) =1 만약 X a = 1;이라고 쓴다면 컴파일 시간 에러가 발생한다.
//X a = 1;
X b = X("Jessie"); //construct X(const char*,int)
a = X(2); //construct X(int) =2
}
//이의 결과는 주석대로 이다.
X a = 1 이라면 어떻게 될까?
당연히 에러가 난다. 암시적 형변환이 exclipt에 의해 제한된 상태이기 때문이다
물론 exclipt를 제거를 한 후에 X a =1; 을 하면?
예러까 나지 않을 것이다.
컴파일러가 스스로 암시적 형변환을 하였기 때문이다.
exclipt가 없다면
X a = X(1);
a = 5;
이러한 문법이 가능해 진다.
C++의 암시적 형변환 규칙을 보면 클래스의 생성자 중에서 하나의 인자를 가지는
생성자는 프로그래머의 의사에 상관없이 컴파일러가 암시적 형변환을 하도록 되어있습니다.
그래서 a = 5 같은 코드를 만나면 알아서 X(int) 같은 애를 호출해서 임시 객체를 만들고
그 임시객체를 가지고 복사 할당 연산자를 호출하겠죠.
어떻습니까?
왠지 에러를 일으킬 소지가 보이지 않나요??.
'Study > C++' 카테고리의 다른 글
bitarray 제작, 활용 (0) | 2009.07.20 |
---|---|
bitarray (0) | 2009.07.18 |
Proxy clss (0) | 2009.07.16 |
디자인 패턴 (0) | 2009.07.16 |
string -> char* -> WCHAR* 타입 변환 (0) | 2009.07.14 |