+ 연산과 = 대입연산 사이에서 호출되는 생성자 함수가 문제일까요?

dltkddyd의 이미지

요 아래

operator= 연산자와 operator+ 연산자

라는 제목으로 글을 올린 적이 있는데, 질문이 장황한 것 같아서 다시 정리해 글을 올립니다.
클래스에서 operator+ 연산자와 operator= 연산자를 오버로딩했습니다. 그리고 연산의 대상은 해당 클래스의 객체입니다.
operator+ 연산의 결과는 해당 클래스로 선언된 지역변수에 저장되어 반환됩니다.
그런데 만약 다음과 같이 연속적인 연산을 한다고 하면,

C=A+B;

A+B의 반환된 결과는 operator= 연산자 함수의 오른쪽 항 값이 됩니다. operator= 함수의 매개변수는 A+B의 결과인 객체를 인수로 받을 수 있는 언급된 클래스의 타입입니다. 이 때 복사생성자가 호출됩니다. 복사생성자를 정의하지 않았다면 기본복사생성자가 호출될 겁니다. 그런데 문제는 전달되는 매개변수인 객체의 속성 중에 포인터가 존재한다면 깊은 복사를 해야 합니다. 그래서 생성자를 만들었습니다. 클래스 이름은 Array이고요. 앞에서 언급된 클래스도 모두 Array입니다. 그 생성자의 원형은 다음과 같습니다.

Array(Array& src);

그런데 문제는 복사생성자의 매개변수가 위처럼 참조형태여야 한다는 것입니다. 그러나 참조형태로 복사생성자를 만들게 되면 operator+ 의 반환결과, 즉 A+B의 결과를 Array(Array& src)의 src가 참조할 수 없습니다. 그 이유는 operator+에서 반환되는 결과는 operator+ 함수의 지역변수이기 때문입니다.
생성자 Array(Array& src)가 operator+의 반환결과를 제대로 참조하려면 operator+ 함수, Array(Array& src) 생성자, operator= 함수의 원형을 어떤 식으로 만들어야 할까요? 요 몇일째 해결이 안되네요.

bluekyu의 이미지

생성자와 operator=의 인자에 const를 붙여주시면 될 것 같습니다.
const를 안 붙이면 임시 객체를 못 받습니다. (임시 객체는 rvalue이기 때문입니다.)

Array(const Array& src);
Array& operator=(const Array& src)
{
    // ...
    return *this;
}
Array operator+(const Array& src)
{
    Array var;
    // ...
    return var;
}

/*** Signature ******************
* blog: http://blog.bluekyu.me/ *
********************************/

dltkddyd의 이미지

생성자의 문제가 아니였네요. 언급하신 부분 중에

Array& operator=(const Array& src);

이렇게 수정하니 질문드린 문제가 해결됩니다. 정말 감사합니다. 몇일째 체증이 다 날아간 듯 합니다.

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

댓글 달기

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