cpp의 call by pointer와 call by reference의 차이점?

lmk378의 이미지

call by pointer와 call by reference의 차이점이 있습니까?
cpp코드의 가독성을 제외한 call by reference가 가지는 장점이 있나요?

랜덤여신의 이미지

우선 레퍼런스는 쓰기 쉽습니다. 포인터처럼 쓸 때마다 역참조 연산자를 쓸 필요가 없죠. 이것만으로도 충분히 쓸 이유가 됩니다. 값으로 전달(call by value)과 코드상으로는 차이가 없기 때문에 쉽게 대체할 수 있죠.

하지만 제가 생각하기에 이보다 더 중요한 점은 레퍼런스는 포인터보다 더 안전하다는 것입니다. 포인터는 실수로 덧셈 뺄셈 연산을 수행하는 것만으로도 잘못된 위치를 가리키게 됩니다. 레퍼런스는 이런 일이 없습니다. 레퍼런스는 심지어 널을 가리키는 것도 불가능합니다.

upriser의 이미지

많은 분들이 잘못 알고 계신 부분인데, 레퍼런스도 널을 가리키는게 가능합니다. (심지어 Joel Spolsky 도 틀린적 있죠)

void foo(int& bar)
{
// do whatever with bar
}

void main()
{
int* baz = 0; // 혹은 NULL, nullptr

foo(*baz);
}

kukyakya의 이미지

내부 구현은 포인터를 이용하는 것과 별반 다르지 않지만 포인터를 이용할 경우 NULL 체크를 해줄 필요성이 있는데 반해 레퍼런스를 이용할 경우는 그럴 필요가 없습니다.

gilgil의 이미지

1. call by reference는 기본적으로 NULL을 허용하지 않는다.
2. call by reference는 copy constructor 등에서 코드의 가독성을 높인다.
등의 잠점이 있을 수 있습니다.

다만 C언어의 직관성(기계어로 어떻게 번역되느냐)이 있지만
C++에서는 코드의 번역에 대한 자세한 이해를 요구하는 단점이 있기도 합니다.

하지만 C++ 한번 맛들이면 C로 rollback하기는 어렵다는... ^^

lmk378의 이미지

답변 감사합니다^^

익명 사용자의 이미지

포인터를 쓰는 경우와 레퍼런스를 쓰는 경우는 일단 문법이 다릅니다. ^^
이게 농담같지만 정말 중요한 차이입니다.

연산자 오버로딩도 사실상 함수호출입니다.
operator+()를 구현할때 하나는 포인터를 사용하고 하나는 레퍼런스를 사용해서 구현해 놨다고 해봅시다.

포인터를 쓰면 a + &b 라고 써서 호출해야겠지만
레퍼런스를 쓰면 a + b 라고 자연스럽게 쓸 수 있습니다.

alwaysN00b의 이미지

실제로 포인터는 파라미터에 넘겨주고자 하는 변수의 주소값을 "복사" 해서 넣어줍니다.

말그대로 값이 복사되기 때문에, 해당 주소값을 이용해서 주소를 증가시키거나 하는 작업을 할수 있습니다.

NULL check나 가독성 등 레퍼런스가 장점은 있으나, 주소를 이용해서 프로그래밍 하는 경우에는 포인터를 사용해야합니다.

언제나 시작

댓글 달기

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