强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针转换成派生类指针,把一种函数指针转换成另一种函数指针,把常量指针转换成非常量指针等。
1.C语言中强转的方法:
int n = 1;
int* p = (int*)n;
当对地址为1的p进行访问的时候,会报如下错误:
int main()
{
int n = 1;
int* p = (int*)n;
*p = 1;
return 0;
}
基类转换为派生类的问题:由于派生类可能成员更多,基类转换为派生类可能越界访问。 函数指针的问题:由于函数的参数存在差异
2.强制转换运算符 C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换: const_cast、static_cast、reinterpret_cast、dynamic_cast C语言强制类型转换缺点: (1)没有从形式上体现转换功能和风险的不同。 (2)将多态基类指针转换成派生类指针时不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象。 (3)难以在程序中寻找到底什么地方进行了强制类型转换。 3.const_cast 仅用于进行去除 const 属性的转换,它也是四个强制类型转换运算符中唯一能够去除 const 属性的运算符。 (1)使用方法:
#include <iostream>
#include <string>
int main() {
const int n = 5;
const std::string s = "Inception";
int* k=const_cast<int*>(&n);
*k = 123;
int& kRef = const_cast<int&>(n);
kRef = 456;
}
下面为利用const_cast进行强制转换,利用指针和引用改变n的值的方法 (2)常成员函数中去除this指针的const属性:
void foo(int nTest) const {}
运行结果如下: (3)为什么常成员函数不能修改成员变量的原因: 先复习一下,之前学过的const的使用:
const int* p;
int =5;
int* const p=&n;
class CTest
{
public:
CTest() : m_nTest(2) {}
void foo(int nTest) const {
void* p = this;
}
public:
int m_nTest;
};
int main() {
CTest t;
t.foo(1);
}
运行结果如下: const在类的前面,代表指针指向的内容是不变的,也就是类的成员变量是不可以改变的。 (4)可以通过以下形式去除类前面的const属性
const_cast<CTest* const>(this)->m_nTest = nTest;
#include <iostream>
#include <string>
class CTest
{
public:
CTest() : m_nTest(2) {}
void foo(int nTest) const {
const_cast<CTest* const>(this)->m_nTest = nTest;
}
public:
int m_nTest;
};
int main() {
CTest t;
t.foo(1);
}
4.学习视频地址:强制转换const_cast 5.学习笔记:强制转换const_cast笔记
|