레퍼런스와 const에 관한 기초적인 질문입니다.

nidle의 이미지

제가 책을 보면서 공부하다가 이해가 안되는부분이있어서요
"
--> int &max(int a,int b){return (a>b)?a:b;}

형식인자들은 함수 블록이 끝나면 소멸되기때문에 값으로 넘어온 것을
레퍼런스로 넘기려면 const키워드를 써야된다.

const int &max(int a,int b){return (a>b)?a:b;} " <----

이렇게 나와있는데요 위의상황에서 레퍼런스쓰면 안된다는것은알겠는데
const를 사용하면 된다는게 그냥 형식이라면 외우겠지만..
먼가 const의 기능이 있는거라면 왜 const를사용하면 되는건지 알려주세요
아 그리고 하나만더요
어떤책은 const를 const int &max(int a,int b){return (a>b)?a:b;}
이렇게 int 앞에다쓰고
다른책은 int getx() const {return x;}이렇게 const를 ()뒤에다쓰는데
차이가없는건가요,,,
그럼이만.. ^^

winner의 이미지

우선

nidle wrote:
int getx() const {return x;}

이건 모르겠군요.

const 는 형 한정어(제 기억이 맞다면 영어로 type qualifier)의 하나로 아는데 여기서 한정이란 수식이란 말과 같은 것 같습니다. 자연언어 문법으로 따지면 형용사죠. 그래서인지 형 지정자(type specifier, 즉 int, double 같은 것) 를 명사로 볼 때 수식하는 명사 앞에 오는 것이 기본입니다.

getx 는 nidle 씨가 만든 name(이것도 programming language 문법에 관한 용어) 인데 name 뒤에 오는 것은 처음봅니다. C++ 니까 만약 이것이 class 의 member 함수라면 이유가 있습니다만 그냥 전역에 선언된 함수라면 저도 처음 보는 군요. 아마도 함수 이름이 getx 인 것으로 봐서 객체의 member x 의 값을 얻기 위한 member 함수인 것 같군요.

다만 const 가 수식하는 형 지정자 뒤에 오는 것은 가끔 봅니다.

int const [name]
같이 쓰는 것을 말하는데 지금은 어떤지 모르겠습니다만 예전에 GCC 가 경고나 오류를 보고할 때 저렇게 쓰더라구요.

이것은 수식하는 것이 name 으로 본다면 충분히 이해가 갑니다.
사실 변경불가가 되는 것은 name 이지 형 지정자가 아니지 않습니까?

특히 pointer 와 관련해서 상수 포인터 상수를 표현할 때 저는
int const * const [name]
const int * const [name] 보다
자연스럽게 보입니다.

하지만 Visual C++ 6 에서는 형 지정자 뒤에 const 를 쓰는 것을 표준에 맞지 않는 방식이라고 경고하더군요.

그리고 표준문서 봐도 형 한정어들은 형 지정자 앞에 오더군요.

쓸데없는 소리가 길었군요. 궁금하신 바에 대해서 이야기 하자면

nidle wrote:
const int &max(int a,int b){return (a>b)?a:b;}

이것도 nidle 씨가 처음에 쓰신 code 와 같은 이유로 틀렸습니다.
return 형이 참조형이 불가능한 이유는 const 와는 상관이 없습니다.
옳게 쓰실려면 형식인자들을 참조형으로 바꿔야 합니다.


int &max(int &a,int &b){return (a>b)?a:b;}
가 되어야 합니다.

return 된 값은 a 혹은 b 가 됩니다.

만약
int c = max(a, b) 라면 상관없습니다만
int & c = max(a, b) 가 된다면
c 를 바꿨을 때 a 혹은 b 중 큰 놈이 따라 바뀔 겁니다.

이것을 막기 위해서는 max 의 return 형을 const 참조형으로 바꾸면 참조형으로 받을 때 역시 const 참조형으로만 받을 수 있기 때문에 a, b 는 변경하지 않게 할 수 있습니다.

doogle의 이미지

nidle wrote:
int getx() const {return x;}

메소드에 const가 붙는 건 그 메소드가 호출객체(즉, this)를 변경하지 않을것을 명확히 하는 것입니다. 내부에서 호출객체의 어떤 멤버값의 변경이 있을경우 컴파일러 에러가 발생(즉 문법적인 오류가 되는거죠)합니다.

이러한 형태의 문법이 필요한 경우가 있는데..
예를 들어 const형으로 생성한 객체인 경우.. 이 객체의 값이 초기 주어진 값이외에는 변경되어선 안됩니다. 따라서 객체의 메소드 호출시 메소드가 객체를 변경시키지 않는다는 보장이 있어야 하는데.. 메소드형에 const는 이를 위한 문법인 것입니다.
제가 말주변이 없는 관계로 나머지는 책을 참조하시길.. ㅡㅡ;;

C++문법을 제대로 공부하고 싶으시면 'C++기초플러스'(성인당)(원서로는 C++ PRIMER PLUS, Setphen Prata저)를 보시면 아주 좋습니다. 제가보기엔 질문하신분이 지금 봐야할 가장 적절한 책인듯 싶네요.
const난 reference 관련된 내용도 이책을 보시면 명확히 그 효과를 아실수 있을 겁니다.

위의 내용은 정확히 495페이지에 설명되어 있군요.(제건 번역판입니다.(제3판))

for1003의 이미지

winner wrote:
우선

nidle wrote:
int getx() const {return x;}

이건 모르겠군요.

함수 뒤에 const가 붙을 수 있는 경우는 멤버 함수가 되는 경우 입니다.
이경우 const 멤버 함수라고 하구요.. 이 멤버함수는 자신을 포함하고 있는 클래스형의 객체가 const 객체인 경우라도 객체의 멤버에 접근할 수 있습니다.
멤버 함수를 const로 선언하는 경우를 간단히 예를 들어 보겠습니다.

class A
{
int m_a;
public:
int getA() const { return m_a; }
void setA(int a) { m_a = a };
// 이하 생략...
};

A a1;
const A a2;

...

a1.setA();
a1.getA();
a2.setA(); // error!
a2.getA();

nidle의 이미지

그렇다면..
const int &max(int a,int b){return (a>b)?a:b;}또한 잘못된
표현이군요,, 책에서는 바른 표현이라고 해서 저도 의문이었습니다.

답변감사합니다 저도 빨리 여기 있는 질문에 답변할 수 있는 날이
빨리왔으면 좋겠네요,,^^

댓글 달기

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