强制转换运算符----const_cast
强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针转换成派生类指针,把一种函数指针转换成另一种函数指针,把常量指针转换成非常量指针等。
C++ 引入新的强制类型转换机制
强制转换运算符
C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:
-
const_cast
-
static_cast
-
reinterpret_cast
-
dynamic_cast
C语言强制类型转换缺点:
主要是为了克服C语言强制类型转换的以下三个缺点。
-
没有从形式上体现转换功能和风险的不同。
例如,将 int 强制转换成 double 是没有风险的,而将常量指针转换成非常量指针,将基类指针转换成派生类指针都是高风险的,而且后两者带来的风险不同(即可能引发不同种类的错误),C语言的强制类型转换形式对这些不同并不加以区分。
-
将多态基类指针转换成派生类指针时不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象。
-
难以在程序中寻找到底什么地方进行了强制类型转换。
强制类型转换是引发程序运行时错误的一个原因,因此在程序出错时,可能就会想到是不是有哪些强制类型转换出了问题。
const_cast
仅用于进行去除 const 属性的转换,它也是四个强制类型转换运算符中唯一能够去除 const 属性的运算符。
*常量对象或者是基本数据类型不允许转化为非常量对象,只能通过指针和引用来修改:*
#include "stdafx.h"
#include <iostream>
#include <string>
int main() {
const int n = 5;
const std::string s = "Inception";
std::string t = const_cast<std::string>(s); //错误
int k = const_cast<int>(n); //错误
}
*可以利用 const_cast 转换为同类型的非 const 引用或者指针:*
#include "stdafx.h"
#include <iostream>
#include <string>
int main() {
const int n = 5;
const std::string s = "Inception";
std::string& t = const_cast<std::string&>(s); //转换成引用
int* k = const_cast<int*>(&n); //转换成指针
*k = 6; //转换后指针指向原来的变量
t = "Hello World!";
}
*常成员函数中去除this指针的const属性:*
#include "stdafx.h"
#include <iostream>
#include <string>
class CTest
{
public:
CTest() : m_nTest(2) {}
void foo(int nTest) const {
//m_nTest = nTest; 错误
const_cast<CTest*>(this)->m_nTest = nTest;
}
public:
int m_nTest;
};
int main() {
CTest t;
t.foo(1);
}