본문 바로가기
프로그래밍/C || CPP

const 멤버 함수와 비 const 멤버 함수 정리

by _BlankSpace 2017. 9. 14.

멤버 함수에 const 를 붙이고, 안 붙이고의 차이는 소소해 보이지만 굉장히 다른 규칙이다.

 

일단, 규칙을 모르고 코딩을 했다가는 컴파일부터 불가능 할 것이다.

또한, 규칙이 까다롭다고 사용하지 않는다면, 그 코드는 굉장히 취약한 상태가 될 것은 뻔할 것이다.

 

이러한 const 을 사용하는 방법을 예제로 간단하게 정리하겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
 
using namespace std;
 
class Point
{
    int x;
    int y;
public :
    Point (int _x = 0int _y = 0) : x(_x), y(_y) { }
    int getX() const { return x; } // const function
    int getY() const { return y; } // const function
 
    void setX(int _x) { x = _x; }
    void setY(int _y) { y = _y; }
 
    void printXY() const// const function
};
 
int main()
{
    const Point p1(00);
    Point p2(25);
 
    p1.printXY();
    p2.printXY();
 
    cout << "p1: " << p1.getX() << ',' << p1.getY() << endl;
    cout << "p2: " << p2.getX() << ',' << p2.getY() << endl;
 
    p1.setX(5);
    p1.setY(15);
    p2.setX(10);
    p2.setY(20);
 
    return 0;
}
cs

 

결과 :

 constEx.cpp: In function ‘int main()’:
 constEx.cpp:31:14: error: passing ‘const Point’ as ‘this’ argument discards qualifiers [-fpermissive]
 p1.setX(5);
           ^
 constEx.cpp:14:10: note:   in call to ‘void Point::setX(int)’
 void setX(int _x) { x = _x; }
             ^
 constEx.cpp:32:15: error: passing ‘const Point’ as ‘this’ argument discards qualifiers [-fpermissive]
 p1.setY(15);
              ^
 constEx.cpp:15:10: note:   in call to ‘void Point::setY(int)’
 void setY(int _y) { y = _y; }
          ^
 

 

코드를 보면, 11, 12, 17 라인은 const 함수로 정의되어 있다.

또한, 22 라인은 const 객체이고, 23 라인은 그냥 객체라고 생각하면 된다.

 

먼저, const 멤버 함수를 간단하게 설명하자면 다음과 같다.

const 멤버 함수는 멤버 함수 내에서 객체의 멤버 변수를 변경하지 않는다는 것을 보장하는 함수라고 한다. 따라서, const 객체는 const 멤버 함수만 호출할 수 있다.

당연히, const 멤버 함수에서 멤버 변수를 변경한다면?   --> 컴파일러 에러가 난다.

 

위의 결과는 31, 32 라인에서 에러가 나게 된다. 31, 32 라인의 객체는 p1 즉, const 객체로 선언한 p1으로 값을 변경하려는 행위를 하기 때문이다. 그에 반해서, 일반 객체인 p2 는 33, 34 라인을  실행해도 아무 문제가 없는 것이다.

댓글