C++ 新特性 强制转换 const_cast

强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针转换成派生类指针,把一种函数指针转换成另一种指针,把常量指针转换成非常量指针等。

强制转换运算符

C++ 引入了四种功能不同的强制转换类型转换运算符进行强制类型转换:

  • const_cast
  • static_cast
  • reinterpret_cast
  • dynamic_cast

C 语言强制类型转换缺点:
主要是为了克服 C 语言强制类型转换的一下三个缺点。

  • 没有从形式上体现转换功能和风险的不同

    例如,将 int 强制转换成 double 是没有风险的,而将常量指针转换成非常量指针,将基类指针转换成派生类指针都是高风险,而且后两者带来的风险不同(即可能引发不同种类的错误),C 语言的强制类型转换形式对这些不同并不加以区分

  • 将多态基类指针转换成派生类指针时不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象

  • 难以在程序中寻找到底什么地方进行了强制类型转换

    强制类型转换是引发程序运行时错误的一个原因,因此在程序出错时,可能就会想到是不是有哪些强制类型转换出了问题

const_cast

仅用于进行去除 const 属性的转换,它也是四个强制转换运算符中唯一能够去除 const 属性的运算符。
常量对象或者是基本数据类型不允许转化为非常量对象,只能通过指针和引用来修改

#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 <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 <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;
    }

private:
    int m_nTest;
};

int main() {
    CTest t;
    t.foo(1);
}
posted @ 2022-08-04 10:22  岁月飞扬  阅读(250)  评论(0编辑  收藏  举报