C++에서 레퍼런스를 통해 함수의 인자를 받을 경우...

ixevexi의 이미지

갑자기 바보같은 생각이 들어서 우문을 올리네요
허구한날 기초만 물어보는 저도 한심하고 -_-;;

클래스를 인자로 주고받는 경우가 있어
카피 오퍼레이션 오버헤드를 조금이라도 줄여보고자
이 클래스 인스턴스를 레퍼런스(&)로 받고 있습니다.

문제는 이 함수를 콜할때 인자를 '임시변수'로 주게되면
이 임시변수가 함수가 끝날 때까지 살아있음을 보증합니까?

괜한 헛소리와 제 무식함만 탄로날까봐 걱정이 되긴 하지만
궁금한걸 어떡해요 ㅠ.ㅜ

blitzerg의 이미지

네 함수호출이 끝나기전까지 살아있습니다.

doldori의 이미지

참고로 const 참조형일 때만 그렇습니다.
이것은 함수 호출에만 해당되는 것이 아니라 const 참조형의 초기화, 연산의 중간
결과 등에도 적용됩니다.

const string& s1 = "C";
string s2 = "I love " + s1 + "++";
ixevexi의 이미지

const참조형일때만 그렇다는 것은
만약 제가 인자를 const Class&로 받지 않고 그냥 Class&로 받을 때는
보장 할 수 없다는 뜻인가요?

위의 코드를 보니 한번 참조한 임시변수의 경우 항상 살아있다라는
뉘양스가 풍기는데 그렇게 이해 해도 되겠습니까?

PS... " "는 C++에서 임시변수가 아닌 const char[]로 알고있습니다.
제가 말하는 상황은
void func( Class & A);
func(A("Hello, World!")); 이런 상황입니다...

C++, 그리고 C++....
죽어도 C++

doldori의 이미지

ixevexi wrote:
const참조형일때만 그렇다는 것은
만약 제가 인자를 const Class&로 받지 않고 그냥 Class&로 받을 때는
보장 할 수 없다는 뜻인가요?

non-const 참조형은 임시 개체를 참조할 수 없습니다. (임시 개체는 l-value가 아니므로.)
non-const Class& 인자를 받는 함수를 임시 개체로 호출하면 컴파일 에러가 납니다.

ixevexi wrote:
위의 코드를 보니 한번 참조한 임시변수의 경우 항상 살아있다라는
뉘양스가 풍기는데 그렇게 이해 해도 되겠습니까?

임시 개체의 수명은 그것을 참조하는 참조형 변수가 살아있을 때까지입니다.
const를 적절히 쓴다면 임시 개체의 수명에 대해 걱정할 일은 거의 없을 것입니다.

ixevexi wrote:
PS... " "는 C++에서 임시변수가 아닌 const char[]로 알고있습니다.
제가 말하는 상황은
void func( Class & A);
func(A("Hello, World!")); 이런 상황입니다...

제가 올린 코드의 뜻은 이렇습니다.
1. string(const char*) 생성자에 의해 임시 string 개체를 생성한다.
2. const 참조형인 s1은 이 임시 개체를 참조한다.
3. s1의 scope가 끝날 때 소멸자가 호출되어 임시 개체가 소멸한다.
s2의 경우 첫번째 + 연산에 의해 반환되는 임시 개체가 다시 두번째 + 연산을
호출한다는 뜻입니다.
ixevexi의 이미지

의문이 확풀리네요!!

저의 얕은 내공으로
항상 const, 임시객체, 레퍼런스 같은데서 헤메네요 ㅠ.ㅜ

그리고 항상 doldori님의 C++관련 포스트는 주시 8) 하고 있습니다.
나름대로 C++인이 적은 이 곳에서 굉장히 큰 즐거움중 하나입니다.

C++, 그리고 C++....
죽어도 C++

댓글 달기

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