본문 바로가기

c언어

클래스 대입

클래스는 "사용자 지정 자료형" 이라고 부를 수 있다.

즉 자료들의 묶음을 하나의 자료형이라고 부르겠다는것이다.

 

학교의 학생이라면 이름, 학번, 성적 등의 정보들이 모여 하나의 학생을 이루는것과 같은것이다.

 

그리고 또한 우리는 매개변수가 있는 생성자라는 개념을 알고있다.

말로 하려다 그냥 코드로 보여주겠다.

a.h

#pragma once

class cA {

private :
	int iTemp;

public :
	cA(int iA) { iTemp = iA; }
	void printiTemp() {	cout << iTemp << endl;}
};

이런경우 매개변수가 있는 생성자를 통해 iTemp의 값을 초기화할 수 있다.

print iTemp의 경우 iTemp의 값을 출력하여 대입이 잘 일어났는지 확인하기 위한 용도이다.

편의를 위해 a.cpp는 만들지 않고 바로 정의하였다.

 

main.cpp

#include "stdafx.h"
#include "a.h"

int main(void) {
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

	cA a(100);
	
	a.printiTemp();

	return 0;
}

그리고 메인에서 cA 형 a를 선언했고 바로 괄호를 이용하여 매개변수를 넣어주었다.

 

이러면 매개변수가 있는 생성자를 통해 iTemp는 100이 될 것이고,

바로 printiTemp로 100이 출력되는 모습을 볼 수 있을것이다.

 

이미 설명했던 부분이다.

 

이번에 말하고 싶은것은 이런것이다.

#include "stdafx.h"
#include "a.h"

int main(void) {
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

	cA a=100;
	
	a.printiTemp();

	return 0;
}

cA a=100;이라고 적어 대입연산자를 사용했다. 이렇게 하면 자동적으로 매개변수 있는 생성자가 호출되고 그 매개변수로 100이 들어가 정상적으로 100이 출력될것이다.

 

매개변수가 여러개라면 중괄호로 묶어주고 타입만 맞다면 이상없이 실행된다.

 

어떻게 보면 단순한데 이거 꽤나 신기한것이다.

대입연산자는 좌항에 우항을 대입하는것인데, 좌항은 클래스 cA형이고 우항은 숫자 100인데 대입이 된 경우이다.

 

이것은 대입연산자 =가 오버로딩되어 우항을 같은 형태로 묵시적 형변환을 시켜 cA형으로 만든 뒤에 대입한 경우이다.

 

꽤나 대단한 광경이지만. 이전에 말했듯 묵시적 형변환 자체가 그닥 좋은 모습은 아니다. 예상치 못한 행동이었기 때문이다. 그래서 그런 경우를 막고 싶다면 생성자 앞에 exsplit을 붙여 묵시적 형변환을 차단할 수 있다.

#pragma once

class cA {

private :
	int iTemp;

public :
	explicit cA(int iA) { iTemp = iA; }
	void printiTemp() {	cout << iTemp << endl;}
};

즉 이렇게 생성자 앞에 explicit하면 이후 메인에서 cA a=100; 에 붉은 줄이 떠서 오류를 알리는 모습을 볼 수 있다. 

 

 

'c언어' 카테고리의 다른 글

static에 대해서  (0) 2023.02.14
const에 대해서  (0) 2023.02.13
상호참조와 전방선언  (0) 2023.02.13
클래스 사용 예시  (0) 2023.02.10
클래스의 특징과 기본적 사용방법 (생성자와 소멸자)  (0) 2023.02.10