상수 멤버 함수 (const member function)
• 컴파일러에게 상수 멤버 함수인 것을 알게 해주는 것
• 멤버 함수의 괄호() 뒤쪽에 const 키워드 사용
함수 선언과 구현으로 분리하는 경우 양쪽에 모두 붙인다.
• 상수 멤버 함수 안에서는 모든 멤버는 상수로 취급
• 상수 객체는 상수 멤버함수만 호출 가능
[예제] const 멤버 함수 필요성
#include <iostream>
class Point
{
public:
int xpos, ypos;
Point(int x, int y) : xpos{ x }, ypos{ y } {}
void set(int x, int y)
{
xpos = x;
ypos = y;
}
void print()
{
std::cout << xpos << ", " << ypos << std::endl;
}
};
int main()
{
const Point pt(1, 2);
pt.print(); // error
}
const 상수 객체(Point) 만들고 print() 호출 할 수 없다.
x, y 와 같은 멤버변수를 변경하지 않지만
컴파일러는 함수 선언부 보고 호출 여부를 결정하는데
함수 선언만으로 멤버 값 변경 여부를 알 수 없기 때문이다.
[예제] const 멤버 함수 적용
#include <iostream>
class Point
{
public:
int xpos, ypos;
Point(int x, int y) : xpos{ x }, ypos{ y } {}
void set(int x, int y)
{
xpos = x;
ypos = y;
}
void print() const // 상수 멤버 함수
{
// xpos = 10; // error
std::cout << xpos << ", " << ypos << std::endl;
}
};
int main()
{
const Point pt(1, 2);
pt.print(); // ok
}
[C++] 레퍼런스 Reference
레퍼런스 (reference, 참조)이미 존재하는 변수에 추가적인 별칭 부여#include int main(){ int n = 10; int& r = n; r = 20; // 값 변경 std::cout C 언어에서는 void swap(int* p1, int* p2) 와 같이call by pointer 방식을 사
zoosso.tistory.com
Q) 상수 객체는 언제 활용될까?
① [예제] const 멤버 함수 필요성
class Rect
{
int x, y, w, h;
public:
Rect(int x, int y, int w, int h)
: x{ x }, y{ y }, w{ w }, h{ h } { }
int getArea() { return w * h;}
};
void foo(Rect r) // call by value --> ???
{
int area = r.getArea();
}
int main()
{
Rect r(1, 1, 10, 10); // 상수객체 아님.
int area = r.getArea(); // ok.
foo(r);
}
② [예제] const 멤버 함수 필요성
class Rect
{
int x, y, w, h;
public:
Rect(int x, int y, int w, int h)
: x{ x }, y{ y }, w{ w }, h{ h } { }
int getArea() { return w * h;}
};
void foo(const Rect& r)
{
int area = r.getArea(); // ???? --> Error
}
int main()
{
Rect r(1, 1, 10, 10); // 상수객체 아님.
int area = r.getArea(); // ok.
foo(r);
}
foo(Rect r) 에서 인자 "Rect r" 은 call by value 방식으로
복사본을 만들기 때문에 오버헤드 발생
이를 방지하기 위해 Rect &r 형태로 reference 사용하는 것이 좋다.
하지만
call by reference 방식으로 사용하게 된다면
Rect r 원본 객체를 변경할 수 있기 때문에
「const Rect& r」 사용하는 것이 더 적합하다.
③ [예제] const 멤버 함수 필요성
class Rect
{
int x, y, w, h;
public:
Rect(int x, int y, int w, int h)
: x{ x }, y{ y }, w{ w }, h{ h } { }
int getArea() const { return w * h; } // const 멤버 함수
};
void foo(const Rect& r)
{
int area = r.getArea();
}
int main()
{
Rect r(1, 1, 10, 10);
int area = r.getArea();
foo(r);
}
→ 「const Rect& r」 되면서 상수 객체가 되었기 때문에
상수 멤버 함수만 사용할 수 있다.
이처럼 상수 멤버 함수 문법으로
객체 상태를 변경하지 않는
모든 멤버 함수는 반드시 상수 멤버 함수로 만들어야 한다.
[C++] return by reference
return by reference 필요성return by value 방식으로 반환 시 객체 복사본을 생성한다. 정확히는 "리턴용 임시객체(temporary)" 생성되어 반환 [예시] return by valuestruct Point{ int x; int y;};Point pt = { 1, 2 };P
zoosso.tistory.com
[C/C++] const 키워드
const 키워드C 언어에서 const는 읽기 전용 변수로 만들어주는 예약어일 뿐완벽한 상수 기능을 갖도록 해주지 못했다.const int n; // 초기값 오류 없음char str[n]; // 배열의 요소 개수로 사용불가int*
zoosso.tistory.com
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] 함수 바인딩 (Funciton Binding) (3) | 2025.02.22 |
---|---|
[C++] mutable 키워드 (1) | 2025.02.21 |
[C++] return by reference (4) | 2025.02.15 |
[C++] class this 키워드 (8) | 2025.02.08 |
[C++] static 변수 필요성 및 활용 (5) | 2025.02.06 |
댓글