栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++四种cast总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++四种cast总结

static_cast

概述:用于静态转换。

特点:

  • 不能用于无关类型的转换,有风险,可能得到一些无意义的值,如int 转double。void 指针和具体类型指针之间的转换有极大风险。
  • 编译期转换。
  • 类的向下转换需要程序员保证安全性。
#include 

int main() {
    int m = 100;
    long n = static_cast(m);

    std::cout << n;
}
const_cast

概述:const_cast 就是用来将 const/volatile 类型转换为非 const/volatile 类型。

特点:

  • 指针转换仍然指向原来的对象。
#include 

int main() {
  const int n = 100;
  int *p = const_cast(&n);
  *p = 234;
  std::cout << "n= " << n << std::endl;
  std::cout << "*p =" << *p << std::endl;
  return 0;
}

dynamic_cast

概述:dynamic_cast 用于在类的继承层次之间进行类型转换,动态转换。

特点:

  • 向上转型是无条件的,不会进行任何运行期检测,所以都能成功。
  • 向下转型的前提必须是安全的,要借助 RTTI 进行检测,所有只有一部分能成功。
  • dynamic_cast 会在程序运行期间借助 RTTI 进行类型转换,这就要求基类必须包含虚函数。
  • dynamic_case需要一定的条件:
class base {
};
class Derived : public base {
};
int main(){
  base *d1 = new Derived();
  // auto c1 = dynamic_cast(d1);
  // 编译不通过,因为base不是多态的。
  return 0;
}
  • 基类必须是多态的,必须有虚函数。
class base {
public:
  virtual void func() {
    cout << "class base" << endl;
  }
};
class Derived : public base {
public:
  void func() override {
    cout << "class Derived" << endl;
  }
};
int main(){
  base *d1 = new base();
  auto ctest = dynamic_cast(d1);
  // ctest->func();
  // 转换失败,运行出错,ctest是nullptr,本质上只允许向上转型。
}
  • dynamic_cast本质上只允许向上转型。
class base {
public:
  virtual void func() {
    cout << "class base" << endl;
  }
};
class Derived : public base {
public:
  void func() override {
    cout << "class Derived" << endl;
  }
};
int main(){
  Derived *d1 = new Derived();
  auto ctest = dynamic_cast(d1);
  ctest->func(); // 输出class Derived,成功转换
}
  • 同时满足实质的向上转型和多态特性。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353119.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号