내가 생각하는 것이 컴파일러가 분석하는 것과 똑같다면 아마도 난 지금쯤 C++의 고수?쯤 되어 있지 않을까 싶다. 멋진 게임을 만들고 있을 것이고 유능한 프로그래머가 되서 여기 저기 국내뿐만 아니라, 해외 여기 저기서 날 스카웃 할려고 노력 할것이다.
하지만, 현실은....-_-;; 내가 아는 것이 별로 없고 컴파일러의 분석을 제대로 파악 하지 못했기 때문에 항상 제자리 걸음이고 책을 늘 봐야 하는 현상에 있는 것이 현실인것 같다는 생각이 든다... 안되는건 알고 있었는데 설명을 하라고 하면.... "안되니깐요..." 라고 말을 할수가 없지 않은가!! 오늘 알게 됐다...
왜 그런가? 이유는 컴파일러의 분석이 내가 생각하는 것과 다르기 때문이다.
즉, 매개 변수를 둘러싼 괄호는 무시 되어도 무방한 것이지만, 그냥 괄호는 함수의 매개 변수 리스트가 있음을 나타내는 것입니다. 그 자체가 함수의 포인터임을 알리는 것입니다.
이젠 에러가 나는 이유를 설명 할수 가 있는데, 내가 생각한것은 Widget w()는 인자값이 없는 기본 생성자를 통해서 객체를 생성 하려고 한것이지만, 컴파일러의 분석은 그게 아니란 말이죠.. 컴파일러는 단순히 Widget를 반환하는 매개변수가 없는 함수w를 선언한 건뿐입니다.
아... 이런것도 모르다니... 젠장
하지만, 현실은....-_-;; 내가 아는 것이 별로 없고 컴파일러의 분석을 제대로 파악 하지 못했기 때문에 항상 제자리 걸음이고 책을 늘 봐야 하는 현상에 있는 것이 현실인것 같다는 생각이 든다... 안되는건 알고 있었는데 설명을 하라고 하면.... "안되니깐요..." 라고 말을 할수가 없지 않은가!! 오늘 알게 됐다...
#include "stdafx.h" #include < iostream > class CWidget {결론부터 말하면 첫번째 부분 widget1(1) 는 에러를 발생하지 않고 두번째 출력부분 widget2()는 에러를 발생한다.
public: CWidget() {} CWidget(const int _iIndex): m_iIndex(_iIndex) {} ~CWidget() {} void Show() { std::cout << "Index " << m_iIndex << ": CWidget 출력" << std::endl; } private: int m_iIndex; }; int _tmain(int argc, _TCHAR* argv[]) { CWidget widget1(1); widget1.Show(); CWidget widget2(); widget2.Show(); return 0; }
왜 그런가? 이유는 컴파일러의 분석이 내가 생각하는 것과 다르기 때문이다.
/// 보통 우리가 쓰는 함수 선언. int Test(const int _i); /// 위와 같은 것입니다. ()는 무시 됨. int Test(const int (_i));/// 매개 변수의 이름이 생략 되도 같은 것임.int Test(const int);위의 3가지 함수 선언은 똑같습니다.
/// Test2는 함수 포인터( 인자는 없고, int를 리턴하는 )를 매개변수로 받음. int Test2(int (*pFun)()); /// 위와 같음 pFun를 포인터로 인식 - C와 C++에서 유효한 문법임. int Test2(int pFun());/// 위와 역시 같음. 매개 변수의 이름이 생략 된 것임. int Test2(int ());역시 위의 3가지 함수 선언은 같습니다.
즉, 매개 변수를 둘러싼 괄호는 무시 되어도 무방한 것이지만, 그냥 괄호는 함수의 매개 변수 리스트가 있음을 나타내는 것입니다. 그 자체가 함수의 포인터임을 알리는 것입니다.
이젠 에러가 나는 이유를 설명 할수 가 있는데, 내가 생각한것은 Widget w()는 인자값이 없는 기본 생성자를 통해서 객체를 생성 하려고 한것이지만, 컴파일러의 분석은 그게 아니란 말이죠.. 컴파일러는 단순히 Widget를 반환하는 매개변수가 없는 함수w를 선언한 건뿐입니다.
아... 이런것도 모르다니... 젠장
'[ Programming ]' 카테고리의 다른 글
멤버 함수 보다는 비멤버 비프렌드 함수에 더 가깝게 쓰자. (0) | 2009.10.18 |
---|---|
사용자 정의 타입변환 함수에 대한 주의를 놓지 말자. (0) | 2009.10.07 |
상속 받는 기본 매개변수 값 변경 금지! (0) | 2009.07.29 |
인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하기. (0) | 2009.07.15 |
상속된 이름을 숨기는 일은 피하자. (4) | 2009.07.05 |