티스토리 뷰

언어/C++

8.9 클래스와 const

js0331 2020. 4. 23. 21:01
#include <iostream>

class Something
{
	public:
	int m_value = 0;
	
	void setValue(int value)
	{
		m_value = value;
	}
	
	int getValue()
	{
		return m_value;
	}
};


int main()
{
	const Something something;
	something.setValue(3);	// error 발생
	
	return 0;
}

 

setValue가 하는일은 m_value를 바꾸어주는 일이다.

 

그렇기 때문에 애초에 잘못된 코드가 되는 것이다.

 

cout << something.getValue() << endl;	// error 발생

 

단지 값을 갖고와서 출력하는 코드인데 오류가 발생하는 이유는?

 

컴파일러가 판단을 할때에는 m_value가 바꿨냐 안 바꿨냐가 아니라 member function이 const냐 아니냐로 판단한다.

 

memeber function의 const는 이 함수 안에서 멤버 variable을 바꾸는 행위를 하지 않는다라는 의미를 내포한다.

int getValue() const
	{
		return m_value;
	}

 

error의 예시

	// error 발생
	void setValue(int value) const
	{
		m_value = value;
	}

 

#include <iostream>

using namespace std;

class Something
{
	public:
	int m_value = 0;
	
	// 3
	Something(const Something& st_in)
	{
		m_value = st_in.m_value;
		
		cout << "copy constructor" << endl;
	}
	
	// 1
	Something()
	{
		cout << "Constructor" << endl;
	}
	
	void setValue(int value)
	{
		m_value = value;
	}
	
	int getValue() const
	{
		return m_value;
	}
};

void print(const Something &st)	// const & 안 사용할 시 복사가 일어남
{
	cout << &st << endl;
	
	cout << st.m_value << endl;
}

int main()
{
	// 0
	Something something;
	
	cout << &something << endl;
	
	// 2
	print(something);
	
	return 0;
}

// Constructor
// 0x7fff8a475a04
// 0x7fff8a475a04
// 0

 

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 << "non-const version" << endl;
		return m_value;
	}
};

int main()
{
	Something something;
	something.getValue();
	
	const Something something2;
	something2.getValue();
	
	return 0;
}

// non-const version
// const version

'언어 > C++' 카테고리의 다른 글

8.11 정적 멤버 함수  (0) 2020.04.24
8.10 정적 멤버 변수  (0) 2020.04.23
8.5 위임 생성자  (0) 2020.04.22
8.4 생성자 멤버 초기화 목록  (0) 2020.04.22
8.3 생성자 Constructors  (0) 2020.04.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함