본문 바로가기
프로그래밍 언어/C++

[C++] 상수 멤버함수 const member function

by 까망 하르방 2025. 2. 19.
반응형

상수 멤버 함수 (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

 

[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

 

[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 키워드

 

[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

댓글