[C++] 함수 앞에 쓰이는 const 키워드는 어떤 의미인가요?

vudghkzm의 이미지

const int func() {
    ...
}

위와 같이 함수 앞에 const 키워드가 쓰일 때가 있던데요.
무슨 의미인지 궁금합니다.

chadr의 이미지

리턴값이 상수라는 이야기 입니다. 즉 리턴된 값은 변경을 하지 못하도록 하는 의도입니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

vudghkzm의 이미지

클래스 A 의 멤버 함수 func() 라는 녀석이 있다고 하고 이 녀석이 const int func() { ... ; return r; } 와 같은 식으로 정의 및 구현되어 있다고 가정하죠.

그럼, 아래에서 변수 b 의 값을 변경하지 못한다는 뜻인가요? 분명 제가 알기론 b 의 값은 임의대로 변경이 가능할텐데...

A* a = new A();
 
...
 
int b = a->func();

뭔가 제가 이해를 잘 못 하고 있는거 같습니다만..
구체적으로 다시 설명부탁드립니다.

hey의 이미지

저도 헷갈렸네요. ^_^ ;
위의 예에서 반환값을 바꿀 수 없다는 것은 맞습니다.

int b = a->func();
b = 3;

에서 실제로 일어나는 일은 func() 메쏘드의 반환값을 b에 대입하는 것이죠. 반환값을 안 바꿨죠? 반환값을 읽어서 b에 대입했을 뿐이잖아요. b는 const가 아니기 때문에 다음 라인에서 고칠 수 있지요.

이런 경우는 어떨까요?

const int& A::func()
{
  ...
}
 
...
 
int& b = a->func();

const 반환값을 const가 아닌 참조자로 받으려고 하니까 컴파일 에러가 나겠죠.
const 참조자로 받으면 b 값을 바꿀 수 없게 됩니다.

May the F/OSS be with you..



----------------------------
May the F/OSS be with you..


익명사용자의 이미지

int func();
func() = i; // X. 값 반환 후 해당 오브젝트 소멸

int& func();
func() = i; // O. 인자 전달

const int& func();
func() = i; // X. 인자 전달 시 lhs 불가

const가 쓰이기까지의 간단한 개념입니다.. 개념이 맞는 건진 좀 자신이 없지만..;;

chadr의 이미지

hey님께서 설명하신게 맞습니다. const는 언어차원에서 지원하는 상수 지시자입니다.

또한 이 const는 강력한(?) 캐스팅을 통해서 빼버릴 수도 있습니다..

하지만 리턴값을 const라고 한 것은 해당 함수를 작성한 사람이 "리턴값은 바꾸면 안된다"
라는 것을 의미하기 때문에 가능하면 리턴값의 변수도 const를 이용하여 사용하시는 편이 좋습니다.

좀 더 자세한 것은 이번에 출간된 effective c++ 3판을 참고 해보시기 바랍니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

ixevexi의 이미지

이 const값에 대해서 아주 잘 정리된 글이 여기 bbs에 있는데
어딨는지 찾질 못하겠네요

거기 내용을 간추리자면

1. const 리턴값은 아무런 의미가 없다
2. const 리턴값이 의미가 있는 경우는 단 한가지 레퍼런스로 리턴하는 경우이다

우선 int func();이란 함수가 있을때
const가 붙어있지 않더라도
리턴값은 r-value이기 때문에 수정이 불가능합니다.
다시 풀어서 설명하면

++func();
이라는 구문은 문법적으로 const int를 반환하지 않더라도
r-value를 수정하려고 했기때문에 오류가 납니다.
그러므로 const return값은 레퍼런스 리턴이 아닌 이상 전혀 쓸때가 없습니다.

혹 틀린게 있다면 ^^ 고수님들이 수정해 주시겠죠??

PS 생각해보니 레퍼런스뿐이 아닌 const형 포인터를 리턴할때도 필요하긴 하겠네요 ^^

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