복사생성자에 대한 질문

bshi02의 이미지

원래 열혈강의 c++교재에는 레퍼런스 타입인 AAA(const AA& i)으로 나와있는데 읽다가 보니까 아래의 앰퍼샌드가 없는 코드가 무한루프에 빠진다고 하는데 다행?하게도 컴파일러가 막아주어서 무한루프에 빠지지 않는다고 하는데...
근데 저는 왜 이 코드가 무한루프에 빠지는지 알고 싶은데요.
왜 무한루프에 빠지나요?
생각해보면 Person obj3(obj2);가 실행되면 Person형의 객체 obj3가 생성되면서 생성자에 obj2객체가 대입되고
생성자 함수에 포함된 "Person(const Person i)호출"이 표시되는데
그 이후 어떻게 무한루프가 되나요?

무한루프가 되려면 cout실행 이전에 생성자에 obj2를 대입할때마다 계속해서 Person 객체가 생성되어서 무한루프가 된다는 이야기인거 같은데
그게 어떻게 가능한가요?

obj3객체가 만들어지면서 obj2가 cout에 대입되니까 그냥 cout이 출력만 되고 끝나는 거 아닌가요?
아님 다른 방법으로 무한루프에 빠지는 건가요?
이 코드가 어떻게 무한루프가 가능하게 되는지 알고 싶네요.

#include <iostream>
using std::cout;
using std::endl;
using std::cin;
 
class Person
{
public:
    Person(){
    cout<<"Person()호출"<<endl;
    }
    Person(int i){
    cout<<"Person(int i)호출"<<endl;
    }
    Person(const Person i)
    {
    cout<<"Person(const Person i)호출"<<endl;
    }
};
 
int main()
{
    Person obj1;
    Person obj2(10);
    Person obj3(obj2);
}
klara의 이미지

void foo(int arg)
{
   std::cout << arg << std::endl;
}
 
...
 
int b = 3;
foo(b);

이런 코드가 있을 때 foo의 인자 arg는 b의 복사된 값입니다.
즉, 위와 동등한 코드를 함수없이 적어보면 다음과 같습니다.

...
int b = 3;
int arg = b; // 복사
std::cout << arg << std::endl;

복사 생성자에서 참조가 아닌 값을 인자로 받으면 인자를 복사해야되기 때문에 복사 생성자를 호출해야합니다.
뭐가 문젠지 보이시나요?

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.