객체를 함수로 전달하면 복사생성자가 호출돼야 하지 않나요?
글쓴이: dltkddyd / 작성시간: 월, 2014/03/10 - 7:53오후
다음과 같은 코드가 있다고 할 때
void f(AnyClass param) {
//statements
}
int main() {
AnyClass arg;
f(arg);//1
return 0;
}1에서 f 함수를 호출하며 arg를 param으로 전달하는 과정에서
AnyClass(const AnyClass& param);
이 호출돼야 할텐데, 호출되지 않는 경우도 있던데요? 왜 생성자가 호출되지 않는 건가요?
Forums:


어떤 경우에 호출이 안되는지 말씀해주셔야 답변을 할
어떤 경우에 호출이 안되는지 말씀해주셔야 답변을 할 수 있을 것 같습니다.
간단하게 짜서 돌려봤는데 제대로 호출이 되네요.
#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); }deque를 제 나름대로 sdeque로 만들었습니다.
그리고 반복자를 사용하는 중에 발생한 문제인데요. 코드는 다음과 같습니다.
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/
http://en.wikipedia.org/wiki/Return_value_optimization
글 잘 읽었습니다.
복사생상자를 호출하는 것은 부의효과이고, 컴파일러 발전 과정에서 여러 번의 복사를 막기 위한 시도가 있었다는 것이죠?
그러면 복사생성자를 호출하지 않는 것을 비정상적인 것이라고 판단하는 것은 잘못된 생각이겠네요?
초자는 여러모로 힘드네요. 확신할 수 없는 게 너무 많습니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
정확하게 알고 계신 것만 확신하시면 됩니다. 잘
정확하게 알고 계신 것만 확신하시면 됩니다. 잘 모르시겠는 건 직접 해보거나 찾아보시면 되구요.