{ 정말 여러가지 이유가 있지만 대표적으로 꼽자면, 가독성이 떨어진다는 점과, reinterpret_cast 보다 더 강력한 cast 이기 때문이다. 그 강력함 중 하나를 설명한다. 포인터는 그 정의가 보이지 않더라도 전방선언으로 마치 보인것 처럼 컴파일러를 속여 컴파일 하게 할 수 있다. 이러한 상태에서 형 변환을 하게 되면, 정의가 보이지 않는데도 형 변환이 가능하게 된다. 이때 해당 정의가 보이지 않기 때문에 메모리 레이아웃을 맞추지 못하고 결국 어떤 일을 할지 모르는 포인터가 만들어 지게 된다. 그런데 VC 2008 에선 .. 잘 된다.. 해당 소스 코드를 첨부 하오니, 한번 테스트 해 보심이 좋을 것 같다. Func.cpp 의 7 라인에 break point 를 걸어서, dp의 멤버 변수가 있고..
CPPCS 검색 결과
{ 알다시피 메모리에는 상수성 메모리가 존재한다. 또한 개념상 상수성이여야 하는 경우도 있다. 이러한 이유로 const 로 설정된 것을 굳이 비상수성으로 만들어 사용할 이유가 없다.(물론 어쩔수 없을 때가 있긴 하다) 그러므로 상수성을 건들여서 버그가 생기거나, 예측할 수 없는 일이 일어나 하루 종일 디버깅을 하기 싫다면, 상수성만은 건들지 않는게 좋다. 대표적인 예를 한번 들어 보자. #include const char* str = "hello, world"; int main( void ) { std::cout
{ static_cast 와 dynamic_cast 는 키워드에서 부터가 정적과 동적 캐스팅이라는 느낌이 온다. static_cast 는 문법상 형변한이 가능하다면(C++의 문법) 그냥 형을 변환시킨다. dynamic_cast 는 문법상 형변환이 가능하더라도, 실제로 형 변환이 가능한가를 런타임에 검사를 한다. 이런 차이가 있기 때문에, static_cast 가 더 빠른 장점이 있지만, 위험한 단점이 있다. 책에서의 한 구절을 옮기면 "전기세 아끼려고 불끄고 공부하다가 눈 나빠진다"라는 말(물론 내가 좀 바꾸었지만)이 있다. 그리고 dynamic_cast 를 써야 한다면, 기반 클래스의 인터페이스가 무척 부족한 것이므로, 한번쯤 디자인에 대해서도 고려를 해봐야 될 듯 싶다. 아참 dynamic_cast ..
{ 필요할 때도 있긴 하지만, 극히 드물기 때문에, 역시 자제하는게 옳다고 생각 한다. 책의 내용 중 "거짓말은 다리가 짧다(독일속담)" 이라는 구절이 있다. reinterpret_cast 는 바로 거짓말과 같다.(그래서 때론 필요할 떄가 있는것 이다. ㅋ) 이 거짓말은 컴파일러의 눈과 귀를 막고, 프로그래머의 횡포를 보고있는 것과 같은 것이다. 대표적으로 reinterpret_cast 는 비트 패턴을 바꾸어 버리거나 재해석하기도 하는데, 책에는 없지만, 이런 예제를 만들어 봤다. #include class ikpil { public: ikpil() : a(0) { } void draw() { std::cout
{ 메모리에 의존한 표현 방식은 플랫폼에 따라서 달라지기 때문에, 너무 연연해 하지 말고, 타입에 의존하여 코드를 짜는게 좋다는 이야기이다. 음.. 그렇다고 해도 타입에 너무 의존해도 큰 코 다치더라. 리눅스와 윈도우에서 돌아가는 서버를 만들고자 할 때 윈도우용 타입을 사용하면 리눅스에서 컴파일이 안되기 때문이다. 이럴 경우에는 고유한 C++ 타입만 사용하면, 문제는 없다. 그래도 여전히 문제가 있는데, 64비트와 32비트와 32비트일 때 이다. 자세한 것은 링크로 대체한다. 검색어 : 32bit 64bit 변수 주의 }
{ 타입을 변환해야지만 가능하다면, 애초에 다형성을 활용해서 짜는게 더 좋지 않겠냐는 이야기이다. 이런 이야기는 무척 많이 들어온 터러 간략하게 말해도 정리가 된다. 그리고 타입의 변환보다 다형성이 코드를 보다 독립적으로 구성 시킬 수 있기 때문에, 타입변환 대신 다형성을 사용하는게 더 편하다. 대표적인 예로, 도형 클래스가 있고, 각 도형 클래스는 자신을 그린다고 하자. 그리고 각 도형을 인자로 받아, 아이디 별로 분기 시켜서 그린다고 했을 때 다음과 같은 코드가 나온다. #include enum eFigure { RECTANGLE, TRIANGLE, CIRCLE }; class CRECTANGLE { public: void Draw() { // 사각형을 그린다. } }; class CTRIANGLE ..
최근댓글