C++ 형 변환 - const_cast

진경천·2023년 10월 27일
0

C++

목록 보기
59/90

const_cast

포인터 또는 참조형의 상수성을 잠깐 제거해주는데 사용한다.
volatile 키워드를 잠깐 제거해주는데에도 사용한다.

const_cast<바꾸려고 하는 타입>(대상);

volatile

컴파일 시간을 최적화하지 않겠다고 선언하는것.
지역적 프로그래밍의 흐름과는 관계없이 외부에서 변수를 바꿀 수 있다.

static_cast<바꾸려고 하는 타입>(대상);
int main() {
	int i = 0;
	i++;
	i++;
	i++;
	return i;
}

증가 연산 없이 바로 3을 eax로 move 시킨다.

int main() {
	volatile int i = 0;
	i++;
	i++;
	i++;
	return i;
}

최적화가 되지 않아 증가 연산과정이 실행된다.
eax로 mov 이후 inc 이후 mov 연산을 3번 실행함.

예제

#include <iostream>

using std::cout;
using std::endl;

void func(const int& i) {
	int& j = const_cast<int&>(i);
	// 정의 되지 않은 형 변환.
	j = 10;
}

int main() {
	const int i = 0;
	func(i);

	cout << i << endl;
}
  • 실행 결과

    0

    형 변환이 이뤄지지 않아 상수성이 제거 되지 않았고
    i의 값 0이 그대로 출력된다.

#pragma warning(disable: 4996)
#include <iostream>
#include <cstring>

using std::cout;
using std::endl;

class String {
private:
	char* _chars;
public:
	String(const char* chars)
		: _chars(new char[strlen(chars) + 1]) {
		strcpy(_chars, chars);
	}

	char& operator[](int index) {
		const String& s = *this;
		const char& c = s[index];
		return const_cast<char&>(c);
	}
	// 입력 및 변경 용도

	const char& operator[](int index) const {
		return _chars[index];
	}
	// 출력 용도
};

int main() {
	String s0("abc");
	cout << s0[0] << endl;
	s0[0] = 'b';

	const String& s1 = s0;
	cout << s1[0] << endl;
}
  • 실행 결과

    b
    b

char& operator[](int index) {
		const String& s = *this;
		const char& c = s[index];
		return const_cast<char&>(c);
	}
	// 입력 및 변경 용도

const_cast를 이용해

const char& operator[](int index) const {
		return _chars[index];
	}

의 상수성의 제거하여 s0를 수정한 것을 볼 수 있다.

profile
어중이떠중이

0개의 댓글