포인터 또는 참조형의 상수성을 잠깐 제거해주는데 사용한다.
volatile 키워드를 잠깐 제거해주는데에도 사용한다.const_cast<바꾸려고 하는 타입>(대상);
컴파일 시간을 최적화하지 않겠다고 선언하는것.
지역적 프로그래밍의 흐름과는 관계없이 외부에서 변수를 바꿀 수 있다.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를 수정한 것을 볼 수 있다.