객체를 함수로 전달하면 복사생성자가 호출돼야 하지 않나요?

dltkddyd의 이미지

다음과 같은 코드가 있다고 할 때

void f(AnyClass param) {
//statements
}
 
int main() {
  AnyClass arg;
  f(arg);//1 
  return 0;
}

1에서 f 함수를 호출하며 arg를 param으로 전달하는 과정에서

AnyClass(const AnyClass& param);

이 호출돼야 할텐데, 호출되지 않는 경우도 있던데요? 왜 생성자가 호출되지 않는 건가요?

kukyakya의 이미지

어떤 경우에 호출이 안되는지 말씀해주셔야 답변을 할 수 있을 것 같습니다.

간단하게 짜서 돌려봤는데 제대로 호출이 되네요.

#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()
dltkddyd의 이미지

그리고 반복자를 사용하는 중에 발생한 문제인데요. 코드는 다음과 같습니다.

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 생성자가 호출되지 않습니다. 문제가 뭔지 도무지 알 수가 없네요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

dltkddyd의 이미지

복사생상자를 호출하는 것은 부의효과이고, 컴파일러 발전 과정에서 여러 번의 복사를 막기 위한 시도가 있었다는 것이죠?
그러면 복사생성자를 호출하지 않는 것을 비정상적인 것이라고 판단하는 것은 잘못된 생각이겠네요?

초자는 여러모로 힘드네요. 확신할 수 없는 게 너무 많습니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

kukyakya의 이미지

정확하게 알고 계신 것만 확신하시면 됩니다. 잘 모르시겠는 건 직접 해보거나 찾아보시면 되구요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.