const reference 관련 의문

vani2의 이미지

'const가 붙지 않은 변수에는 const를 대입할 수 없다' 를 기준으로 보았을때

레퍼런스 참조에서

void foo(int& a) {
printf("%d", a);
}

이런식으로 인수에 const를 붙이지 않고서 함수를 만들고

const int a = 12;

foo(a);

하니 오류가 나네요..

그렇다면 클래스의 복사 생성자의 인수를 const를 붙이지 않고 만들경우 위와같은 문제가 생길까요?

이전에 복사 생성자에 const를 붙이는 것은 '선택'이다 라는 말을 들은 것 같은데 이것은 틀린말 아닐까 생각 되네요..

peecky의 이미지

함수 인수로 레퍼런스나 포인터를 받을 때 const 키워드를 안 쓴다는 것은, 파라메터로 받은 인스턴스가 함수 내부에서 변경될 수 있음을 의미합니다. (꼭 그렇게 동작해야 한다가 아니라, 함수의 소스코드 내용을 모르는 상태에서 그 함수를 사용해야 되는 프로그래머의 입장에서 생각해보세요.)
여기에 const 변수를 넘겨주면 에러가 나며, 복사 생성자도 예외는 아닙니다.

복사 생성자가 파라메터 인스턴스를 변경할 이유가 없다면 const로 쓰고, 아니라면 const 없이 쓰면 됩니다.

vani2의 이미지

그렇군요.

그러면 포인터나 레퍼런스 같은 유도형을 제외한 일반 타입들은 const를 붙이지 않는것이 좋을까요?

아니면 const는 되도록 붙이는게 좋나요?

peecky의 이미지

호출하는 쪽 입장에서 보면 어차피 복사본이 사용될 거라 const 여부는 상관없고, 호출받는 쪽 입장에서도 값이 변경되는 게 별다른 부작용이 없다면 const 붙일 필요는 없습니다.
관례적으로는 const를 안 쓰는 경우가 대부분이더군요.

vani2의 이미지

아 그렇군요 세세한 답변 감사합니다. 도움이 되었습니다.

navs의 이미지

복사 생성자의 인자의 멤버를 변경하는 경우도 있겠죠.

----------------------
navs:KIM Hyuntak
----------------------

댓글 달기

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