평소에 클래스 정의 할 때, 습관처럼 기본 소멸자, 즉
class Foo { virtual ~Foo() {} };
소멸자에 어떤 다른 일을 시키면 모를까 저렇게 기본적인 소멸자를 호출해야 하는 이유가 있나요 ?
아님, 저런 기본 소멸자는 사실 적을 필요는 없는데, 그냥 좋은 습관 차원에서 쓰기를 권장(?)하는 건가요?
뭐, 중요한 질문은 아니지만 평소에 궁금하던 거라서요.
저렇게 따로 써 주는 이유는 다른 게 아니라 virtual 때문입니다.
virtual
다형성을 사용할 클래스 계통의 기본 클래스는 반드시 가상 소멸자를 가져야 하지요.
가상 소멸자가 필요 없는 경우엔 사실 웬만하면 컴파일러가 제공해 주는 소멸자를 쓰면 되기는 하는데...
class Foo{ ~Foo(){ /* Do nothing special */ } // "소멸자 안에 넣을 코드를 깜빡하고 안 넣은 게 아니라 // 정말로 그 안에서 따로 더 할 일이 없음!" };
위와 같이 해 주면 나중에 읽는 프로그래머가 생각을 한 번 덜 해도 되는 효과가 있지요.
덧. C++11부터는 이래도 됩니다.
class Foo{ ~Foo() = default; // 컴파일러가 만들어주는 소멸자로도 충분하다! };
클래스를 정성들여 만들라 치면 말씀하신 대로 하는게 최고인것 같은데요,
여러 클래스들을 만들다 보니 저 한줄 적기도 귀찮아서요(헉...!), 저 소멸자 라인을 아예 안써도 대부분은 컴파일러가 알아서 이해할 것 같은데요, 혹시 안그런 경우도 있나 싶어서요.
즉, 소멸자에서 손으로 적는 코드가 아무것도 없지만 그래도 꼭 저 소멸자 문장을 적어야 하는 경우가 있나 싶어서요.
https://hashcode.co.kr/questions/323/%EA%B0%80%EC%83%81-%EC%86%8C%EB%A9%B8%EC%9E%90%EB%8A%94-%EC%96%B4%EB%96%A4-%EA%B2%BD%EC%9A%B0%EC%97%90-%EC%93%B0%EB%8A%94-%EA%B1%B4%EA%B0%80%EC%9A%94 여기를 참고해 보시면 될것 같습니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
저렇게 따로 써 주는 이유는 다른 게 아니라
저렇게 따로 써 주는 이유는 다른 게 아니라
virtual
때문입니다.다형성을 사용할 클래스 계통의 기본 클래스는 반드시 가상 소멸자를 가져야 하지요.
가상 소멸자가 필요 없는 경우엔 사실 웬만하면 컴파일러가 제공해 주는 소멸자를 쓰면 되기는 하는데...
위와 같이 해 주면 나중에 읽는 프로그래머가 생각을 한 번 덜 해도 되는 효과가 있지요.
덧. C++11부터는 이래도 됩니다.
클래스를 정성들여 만들라 치면 말씀하신 대로 하는게
클래스를 정성들여 만들라 치면 말씀하신 대로 하는게 최고인것 같은데요,
여러 클래스들을 만들다 보니 저 한줄 적기도 귀찮아서요(헉...!),
저 소멸자 라인을 아예 안써도 대부분은 컴파일러가 알아서 이해할 것 같은데요,
혹시 안그런 경우도 있나 싶어서요.
즉, 소멸자에서 손으로 적는 코드가 아무것도 없지만 그래도 꼭 저 소멸자 문장을 적어야 하는 경우가 있나 싶어서요.
https://hashcode.co.kr
https://hashcode.co.kr/questions/323/%EA%B0%80%EC%83%81-%EC%86%8C%EB%A9%B8%EC%9E%90%EB%8A%94-%EC%96%B4%EB%96%A4-%EA%B2%BD%EC%9A%B0%EC%97%90-%EC%93%B0%EB%8A%94-%EA%B1%B4%EA%B0%80%EC%9A%94 여기를 참고해 보시면 될것 같습니다.
댓글 달기