개발 Study

#27. const와 class, 멤버 이니셜라이저

HYuk 2021. 5. 6. 20:46
728x90

hyukee.tistory.com/38

 

#26. 클래스의 생성자, 소멸자

class CLS { public: CLS() // 생성자 { cout<<"생성자 호출"< 생성자 -> 객체 생성 시 자동으로 호출 되는 것 클래스의 이름으로 정의 되는데, 생성자는 반환타입이 없지만 () 안에 인자(매개변수)를 넣어 줄

hyukee.tistory.com

#이니셜라이저

-> 메모리할당 단계에서 작동하는데, 선언과 동시에 초기화를 할 수 있다.

class 생성자의 선언부와 정의부 사이에 콜론(:)을 사용하여 이니셜라이저를 사용할 수 있다.

class CLS
{
	const int m_iA;

public:
	CLS(int _ia) // 생성자
		:m_iA(_ia){} // 이니셜라이저
};

 


#const

1. class내에서 함수를 만들 때,

const를 사용한 const멤버 함수를 작성하면 class내의 멤버변수는 그 함수 내에서 변경이 불가능하다.

(단, 함수내의 지역변수는 변경이 가능하다.)

class CLS
{
	int m_iA;

public:
	void plus()const
	{
		int i; // 지역변수
		m_iA = 300; //멤버변수 변경 불가능

		i = 100; // 지역변수는 변경 가능
	}
};

 

 

2. 함수의 리턴값이 래퍼런스의 형태일 때, 직접 접근하여 값변경이 가능하므로 함수 맨앞에 const를 붙여서 안전하게 사용할 수 있다.

#include "stdafx.h"

class CLS
{
	int m_iA;

public:

	void Set_m_iA()
	{
		m_iA = 10;
	}

	/*const*/ int& Get_m_iA() // 레퍼런스값 반환
	{
		return m_iA;
	}

};


int main()
{
	CLS cls;
	
	cls.Set_m_iA();
	cout << "m_iA: " << cls.Get_m_iA() << endl;
	cls.Get_m_iA() = 100; // 값변경이 가능하다
	cout << "m_iA: " << cls.Get_m_iA() << endl;

	return 0;
}

 

 

3. 객체 생성시 const로 생성할 수 있다.

이때 class 모든 속성이 const가 되기 때문에, 값변경이 불가능하다(이니셜라이저를 이용한 초기화는 가능)

함수를 불러 올 때에도 const가 붙지 않은 함수는 내부에서 값변경을 할 수 있기 때문에, 해당함수를 불러오지 못함

#include "stdafx.h"

class CLS
{
	int m_iA;

public:

	CLS(int _a)
		:m_iA(_a)
	{
	}

	void Set_m_iA()
	{
		m_iA = 10;
	}
	
	int Get_m_iA()const
	{
		return m_iA;
	}

};


int main()
{
	const CLS cls(6);
	cls.Get_m_iA();
	cls.Set_m_iA(); // const형식의 함수가 아니기 때문에 불가능

	return 0;
}
728x90