다음과 같은 코드가 있다고 할 때
void f(AnyClass param) { //statements } int main() { AnyClass arg; f(arg);//1 return 0; }
1에서 f 함수를 호출하며 arg를 param으로 전달하는 과정에서
AnyClass(const AnyClass& param);
이 호출돼야 할텐데, 호출되지 않는 경우도 있던데요? 왜 생성자가 호출되지 않는 건가요?
어떤 경우에 호출이 안되는지 말씀해주셔야 답변을 할 수 있을 것 같습니다.
간단하게 짜서 돌려봤는데 제대로 호출이 되네요.
#include <iostream> struct test { explicit test() { std::cout << __PRETTY_FUNCTION__ << std::endl; } ~test() { std::cout << __PRETTY_FUNCTION__ << std::endl; } test(const test&) { std::cout << __PRETTY_FUNCTION__ << std::endl; } test& operator=(const test&) { std::cout << __PRETTY_FUNCTION__ << std::endl; return *this; } int n; }; void f(test t) { (void)t; } int main() { test t; f(t); }
$ ./a.out test::test() test::test(const test&) test::~test() test::~test()
그리고 반복자를 사용하는 중에 발생한 문제인데요. 코드는 다음과 같습니다.
template<typename T> class Siterator:public std::iterator<std::random_access_iterator_tag,T> { Siterator(const Siterator<T>& src) { pt=src.pt; cout<<"In Siterator "<<endl;//test } Siterator operator+(const int offset) { Siterator tmp=(T*)(pt+offset); return tmp; } }; template<typename PTRTYPE> class sdeque { siterator begin() { //statement } }; int main() { sdeque<char> obj1; obj1.appendMemToFirst(5); obj1.appendMemToLast(7); char k='A'; for(unsigned long int i=0;i<obj1.length;i++) { obj1[i]=k++; } obj1.insert(obj1.begin()+4,obj1.begin()+6,obj1.begin()+6);//여기서 생성자가가 호출되지 않습니다. }
insert 함수 호출시 매개변수인 반복자 객체를 전달하는 과정에서 Siterator 생성자가 호출되지 않습니다. 문제가 뭔지 도무지 알 수가 없네요.
본인 맞습니다. 인증샷 우헤헤헤... 로 대신합니다.
http://en.wikipedia.org/wiki/Return_value_optimization
복사생상자를 호출하는 것은 부의효과이고, 컴파일러 발전 과정에서 여러 번의 복사를 막기 위한 시도가 있었다는 것이죠? 그러면 복사생성자를 호출하지 않는 것을 비정상적인 것이라고 판단하는 것은 잘못된 생각이겠네요?
초자는 여러모로 힘드네요. 확신할 수 없는 게 너무 많습니다.
정확하게 알고 계신 것만 확신하시면 됩니다. 잘 모르시겠는 건 직접 해보거나 찾아보시면 되구요.
텍스트 포맷에 대한 자세한 정보
<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]
어떤 경우에 호출이 안되는지 말씀해주셔야 답변을 할
어떤 경우에 호출이 안되는지 말씀해주셔야 답변을 할 수 있을 것 같습니다.
간단하게 짜서 돌려봤는데 제대로 호출이 되네요.
deque를 제 나름대로 sdeque로 만들었습니다.
그리고 반복자를 사용하는 중에 발생한 문제인데요. 코드는 다음과 같습니다.
insert 함수 호출시 매개변수인 반복자 객체를 전달하는 과정에서 Siterator 생성자가 호출되지 않습니다. 문제가 뭔지 도무지 알 수가 없네요.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
http://en.wikipedia.org/wiki/
http://en.wikipedia.org/wiki/Return_value_optimization
글 잘 읽었습니다.
복사생상자를 호출하는 것은 부의효과이고, 컴파일러 발전 과정에서 여러 번의 복사를 막기 위한 시도가 있었다는 것이죠?
그러면 복사생성자를 호출하지 않는 것을 비정상적인 것이라고 판단하는 것은 잘못된 생각이겠네요?
초자는 여러모로 힘드네요. 확신할 수 없는 게 너무 많습니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
정확하게 알고 계신 것만 확신하시면 됩니다. 잘
정확하게 알고 계신 것만 확신하시면 됩니다. 잘 모르시겠는 건 직접 해보거나 찾아보시면 되구요.
댓글 달기