승쨩개발공부

[C++] const와 클래스, 멤버함수, 이니셜라이져 본문

C++

[C++] const와 클래스, 멤버함수, 이니셜라이져

Unknowns 2021. 12. 2. 23:32

const와 클래스

 

const로 멤버 변수 선언 시 선언부에서 바로 초기화가 가능하다.

const int		m_a = 10;

단, 해당 클래스로 만든 모든 객체가 동일한 값을 가지게 된다.

그러므로 const로 멤버 변수 선언 시 초기화를 시키는 방법은 이니셜라이져를 사용하는 것이다.

 

 

이니셜라이져란?

메모리 할당과 동시에 호출되는 것.

메모리 할당과 동시에 호출되기 떄문에 선언과 동시에 멤버 변수 초기화를 할 수 있다.

 

 

이니셜라이져 선언 방법

생성자의 선언부와 정의부 사이에 :(콜론)으로 명시해준다.

class CObj
{
public:
	CObj(int _a, int _b)    
		// 이니셜라이져를 사용한다는 의미		
		: m_a(_a), m_b(_b)
	{		
		m_a = _a;
	}

private:
	const int		m_a;
	const int		m_b;

 

생성자 호출 순서

객체 생성 -> 메모리 할당 -> 생성자 호출

메모리 할당 당시에 m_a는 쓰래기 값으로 초기화가 진행된다.

이후 생성자에서 대입을 시도하는 것은 선언 후 초기화 형태이다.

 

 

이니셜라이져와 생성자의 차이점

// 이니셜 라이져
int a = 10;

// 생성자
int a;
a = 10;

 

const와 멤버 함수

const의 위치에 따라 상수화 되는 것이 다르다.

 

 

 

 

 

1.반환 타입 앞에 있는 const

반환타입 앞에 const가 붙으면 외부에서 수정이 불가능하다.

class CObj
{
public:
	CObj(){}

public:
	const void Const_Func()
	{		
		m_a = 10; // 불가능	
	}

private:
	const int m_a;
};

 

 

 

2.반환 타입 뒤에 있는 const

반환타입 뒤에 const가 붙으면 정의부가 상수가 된다.

-> 정의부 내부에서 멤버 변수들의 값 변경이 불가능하다.

class CObj
{
public:
	CObj(){}

public:
	void Const_Func() const
	{		
		m_a = 10; // 불가능	
	}

private:
	int m_a;
};

단, 지역 변수들의 값 변경은 가능하다.

class CObj
{
public:
	CObj(){}

public:
	const void Const_Func() const
	{		
		int a = 10;
		a = 20;
	}
private:
	int m_a;
};

const 멤버 함수 내부에서는 일반 멤버 함수 호출이 불가능하다.

-> 일반 멤버 함수 내부에서 멤버 변수들의 값 변경 시도가 있을 수 있기 때문이다.

class CObj
{
public:
	CObj(){}

public:
	const void Const_Func() const
	{			
		Func();        // 불가능
		Const_Func();  // 가능
	}

	void Func()
	{
		int b = 10;
	}
};

 

 

const 객체

const CObj	obj;

멤버 변수들이 모두 const화 된다.

즉, 객체가 가지고 있는 멤버들의 값을 변경하지 못한다.

이로 인해, const 멤버 함수 호출이 가능하다.

일반 멤버함수들의 호출은 불가능하다.

obj.Const_Func(); // 가능
obj.Func();       // 불가능

단, : (이니셜라이져)를 이용한 변수 초기화는 가능하다.

 

 

 

원칙적으로 모든 곳에 const를 사용한다. 여기에는 지역 변수와 함수 매개 변수도 포함된다.

->개체를 수정하지 않는 멤버 함수에는 모두 const를 붙인다.

int GetNum() const;

값(value) 형식의 변수를 const로 반환하지 않는다.

포인터나 참조(reference)를 반환할 경우에만 const반환을 한다.

 

 

단순 상수 변수에는 const대신 constexpr을 사용한다

const int BUFFER_SIZE = 512;     // 적용전

constexpr int BUFFER_SIZE = 512; // 적용후

'C++' 카테고리의 다른 글

[C++] 복사 생성자(얕은복사, 깊은복사)  (0) 2021.12.03
[C++] static과 클래스, 멤버함수  (0) 2021.12.02
[C++] 전방 선언  (0) 2021.12.02
[C++] 생성자와 소멸자  (0) 2021.12.02
[C++] 클래스, 클래스의 4대 속성  (0) 2021.12.01