c++에서 함수의 *인자와 &인자 차이는 뭔가요?

dalili의 이미지

c++ 에서 보니까 c하고 문법이 좀 다른것 같아서요

const Complex operator +(const Complex &T) const {
Complex R;
R.image = image + T.image;
R.real = real + T.real;
return R;
}

Complex operator +(const Complex *T) const {
Complex R;
R.image = image + T->image;
R.real = real + T->real;
return R;
}

두 함수 차이가 있나요?

klyx의 이미지

C랑 똑같으면 C++이 존재하는 이유가 없겠지요. 그외에도 다른점 많으니 C++계속 써야 한다면, C++ 입문서 한번 훑어 보시는게 좋습니다.
이것만 알면된다면 "C++ 레퍼런스 연산자" 또는 "C++ 레퍼런스 변수" 등으로 찾아보세요.

dalili의 이미지

포인터 변수(*)와의 차이점
포인터는 자체 메모리 공간을 가지지만 레퍼런스는 자체 메모리 공간 없음

그런데 컴퓨터 입장에서 레퍼런스는 메모리 주소공간 4byte가 없이 처리 할 수 있다는게 궁금하군요

superwisdom의 이미지

레퍼런스도 컴파일러 내부적으로는 포인터를 이용하여 구현됩니다.

단순히 언제 레퍼런스 사용하고, 언제 포인터 쓰면 좋은지라던가 둘의 차이점을 알고 싶으시면
More effective C++라는 책의 "항목 1 : 포인터와 참조자를 구분하자"를 읽어보시기 바랍니다.
http://ikpil.com/348 -> 이렇게 정리해놓은 블로그도 있지만, 직접 예문과 함께 읽어보시는게
오해 없이 확실히 이해가 가실겁니다.

그게 아니고 C++을 공부하시는 중이라면 입문서 하나 사셔서 첨부터 차근차근 읽어보심이
좋을것 같습니다. "난 C는 아니까, C++이 C랑 다른 점만 찾아서 봐야지.."는 생각보다 힘듭니다.
C++이 C를 기본으로 하는것은 맞지만, 훨신 더 복잡하고 많은 개념을 포함하고 있어서.. 체계적으로
입문서 정독하시기를 추천합니다. ^^

violino의 이미지

레퍼런스는 포인터처럼 프로그래머가 일일이 메모리 관리를 할 필요가 없습니다.
대신 Call depth 가 깊어질수록 레퍼런스 카운터란걸 내부적으로 증가시키고,
나중에 리턴할때마다 감소시켜서 레퍼런스 카운터가 0가 되면 변수를 릴리즈하죠.
포인터처럼 아무데나 보내고, 리턴하고 하는 식으로 쓸 수는 없지만,
레퍼런스를 자주 써 버릇을 하면, 효율적인 메모리 관리에 잇점이 많아요.
(제가 아는 한 미국 분은 포인터를 하나도 안쓰는 프로그래밍에 치중하더군요
그렇게 하니깐 사실 코드의 가독성은 아주 좋아집니다.
하지만, 포인터 하나 안쓰고 프로그래밍 한다는게 저한텐 너무 어려웠어요)

vio:

klyx의 이미지

'레퍼런스 변수'와 '레퍼런스 카운팅'은 전혀 상관없는 이야기입니다.

레퍼런스 변수가 존재하고 안하고와, 가리키는 변수가 할당되고 해제되는 것에는 전혀 관계가 없습니다.
레퍼런스도 포인터처럼 아무데나 보내고 리턴하는 식으로 쓸수 있습니다.

레퍼런스 카운팅은 boost::shared_ptr 과 같은 스마트 포인터에서, 자동화된 메모리관리를 위해 이용되는 기법입니다.

violino의 이미지

죄송합니다. 제가 잘못 설명했군요. (한참 C++을 안썼더니 이젠 다 헷갈리네요)
혼돈을 없애기 위해 다시 설명해야겠네요.

xylosper님 설명처럼 reference variable과 reference counting은 말만 비슷하지 상관없습니다.
reference counting은 garbage collection에 쓰이는 기술이죠.
제가 boost library는 안써봐서 모르겠네요.
아마 자바의 변수처럼 garbage collection을 해 주는 것 같군요.
(참고로 저의 설명은 자바 레퍼런스 변수에 해당되는 것 같습니다)

레퍼런스 변수는 반드시 존재하는 Object을 참고해야 합니다.
(즉, nickname 이라고 생각할 수 있겠죠)
또한, 포인터처럼 de-referencing 할 필요가 없습니다.
그러므로 call by reference 를 구현할때 사용이 간편한 장점이 있습니다.
이런 이유로 C++ 의 operator overloading은 매개변수와 리턴형 모두 레퍼런스를 사용합니다.

PS> xylosper님 지적 감사합니다.

댓글 달기

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