728x90
#include <iostream>
#include <string>
using namespace std;

class Something
{
public:
	int m_value = 0;

	Something(const Something& st_in)
	{
		m_value = st_in.m_value;
		cout << "복사 생성자" << endl;
	}
	
	Something()
	{
		cout << "클래스 생성" << endl;
	}
	void setValue(int value) { m_value = value; }
	int getValue() const
	{
		return m_value;
	}
};

void print(const Something &st)
{
	cout << &st << endl;
	cout << st.getValue() << endl;
}

int main()
{
	Something something;
	cout << &something << endl;
	print(something);
	something.setValue(4);
	cout << something.getValue() << endl;
    return 0;
}

 

 

const는 평소에 상수를 선언할 때 사용했습니다.

 

Something이라는 class를 만들고  something 인스턴스를 생성합니다.

class 앞에 const 를 붙여주면 something 인스턴스는 setValue 함수로 값을 변경할 수 없습니다.

 

something 인스턴스에서 getValue로 value 값을 가져오려고 해도 오류가 납니다.

컴파일러가 판단할때는 value 값이 바뀌냐 안 바뀌냐가 아닌 member function 이 const이냐 아니냐로 판단합니다.

 

class의 인스턴스를 const로 선언할 땐 const member function 만 사용이 가능합니다.

 

틈만 나면 const 를 쓰는 것이 좋습니다 논리 오류와 코딩 실수를 방지할 수 있기 때문입니다.

 

 

void print(Something st)
{
	cout << &st << endl;
	cout << st.getValue() << endl;
}

 

함수의 파라미터로 call by value 를 하게 되면 복사가 일어납니다.

 

최적화를 할때는 함수의 파라미터로 void print(const class_name reference 변수(&변수))

 

 

class member function을 const로 오버 로딩 도 가능합니다.

 

#include <iostream>
#include <string>
using namespace std;

class Something
{
public:
	string m_value = "default";

	const string& getValue() const
	{
		cout << "const version" << endl;
		return m_value;
	}
	// 메모리 주소 자체를 리턴하기 때문에 대입 연산자로 값을 넣으면 값이 변경된다.
	string& getValue()
	{
		cout << "None const version" << endl;
		return m_value;
	}
};

int main()
{
	Something something;
	something.getValue() = 10;

	const Something something2;
	something2.getValue();
	return 0;
}

 

class 인스턴스를 선언할때 const로 선언된 인스턴스는 return 된 value를 수정할 수 없습니다.

보통 function 오버로딩을 할 때 파라미터로 구분 지어 오버 로딩을 했는데 const 로도 오버 로딩을 할 수 있습니다.

하지만 그렇게 자주 하는 방법은 아닙니다.

 

 

 

 

728x90