조언주신 대로 개념 다시 잡아가려고 책보고 있습니다.
글쓴이: dltkddyd / 작성시간: 토, 2014/05/17 - 3:09오후
읽어보라고 권하신 스콧 마이어스의 이펙티브 씨++ 읽고 있습니다. 그런데 처음부터 또 질문이 떠오르는데요.
#include <iostream> using namespace std; class Test { public: int num; explicit Test(int _num) { cout<<"explicit Test(int _num)"<<endl; num=_num; } /*Test(const Test& src) { cout<<"Test(const Test& src)"<<endl; num=src.num; }*/ }; int main() { Test obj2(5); //Test obj1=3; cout<<"from here"<<endl; Test obj1=obj2;//명시적으로 변환? 어떤 생성자도 호출되지 않는데 obj1 객체는 유효하며 멤버 num의 값도 5이다. //생성자가 호출되지 않아도 객체가 어떻게 생성되는지? 아니면 어떤 숨겨진 생성자가 호출된 건가요? //복사생성자를 정의했을 경우에는 저 복사생성자가 호출될텐데, 복사생성자로 객체가 만들어지는 과정과 위의 예에서 객체가 만들어지는 경우는 무엇일 틀린가요? cout<<obj1.num<<endl; return 0; }
주석에 언급된 글이 제 궁금증입니다. 명시적 변환에서 생성자 호출 없이도 대입이 왜 가능한가요?
"모든 객체는 생성자가 호출되어야 유효하다."
라는 명제가 있다라면, 저 경우는 이 명제에 모순되므로 무효해야 할텐데요.
Forums:
복사 생성자가 불립니다. 숨겨져 있죠.
복사 생성자가 불립니다. 숨겨져 있죠.
---
http://coolengineer.com
제가 봐도 명시적 변환이 아닌데, 명시적 변환이라고
제가 봐도 명시적 변환이 아닌데, 명시적 변환이라고 책에 나와있더군요. 그래서 ?를 붙인 겁니다. 이상해서. 아마도 그 전의 대입과 관련해서 언급한 것 같은데요.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
기본 복사 생성자가 호출된 겁니다. (default copy constructor)
생성자를 정의하지 않아도 객체 생성이 가능한 건 기본 생성자(default constructor)가 있기 때문이지요.
복사 생성자를 정의하지 않아도 저 선언이 가능한 건 기본 복사 생성자가 있기 때문입니다.
저는 이렇게 생각했습니다.
기본생성자만 있는 것이 아니었군요.
네, 알겠습니다. 전 기본생성자만 있는지 알았습니다. 기본복사생성자라는 것도 있는 거군요. 예전에 문법서에서 봤던 내용인데, 잠깐 망각했습니다. 그런 생각이 언뜻 들었습니다. 답변 감사드립니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
기본을 무엇으로 보느냐에 따라.
그냥 복사 생성자겠죠. 기본이라 함은 아무런 매개변수를 언급하지 않아도 자동으로 호출되는 멤버를 기본이라 하더군요. 기본생성자에서 그 생성자가 그렇죠. 복사 생성자라는 것은 이미 매개변수를 취하므로 기본이라고 할 수 없겠군요. 그냥 복사생성자로 통일하는 게 좋겠군요. 여하튼 답변 감사드립니다. 덕분에 복습하고 갑니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
아닙니다. 내용을 맘대로 짐작하지 마시고 C++ 표준
아닙니다. 내용을 맘대로 짐작하지 마시고 C++ 표준 문서를 구해서 기본 복사 생성자에 대한 내용을 읽어보시길 바랍니다.
타입이같은데 왜 그걸 '변환'이라고 부르시나요?
타입이같은데 왜 그걸 '변환'이라고 부르시나요?
문법책부터 보세요
문법책부터 보세요
effective c++은 초보가 보는 책이
effective c++은 초보가 보는 책이 아닙니다.
님은 지금 기본 문법서를 차근차근 봐야하는 수준입니다.
님을 얕봐서 그런게아니라 정말로 도움이 되라고 드리는 말입니다.
댓글 달기