美文网首页
新式转型标识符

新式转型标识符

作者: Myth52125 | 来源:发表于2017-08-11 12:43 被阅读0次

一、dynamic_cast<T>(exp)

用于运行时检查该转换是否类型安全
基类指针或引用向子类转换
只能操作指针或者引用 。

将基类指针向派生类指针转换,失败返回nullptr,成功返回对象。
如果是引用,转型失败抛异常。

类中必须要有一个虚函数,应该是dynamic_cast会用虚函数,或虚函数表。
说是用RTTI来判断。

RTTI

RTTI(Run-Time Type Information),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

二、static_cast<T>(exp)

最常用的类型转换

非指针和引用类型

int与float之间等

指针之间

可以将基类类型的指针转向派生类,而且调用派生类的函数。即使这个指针指向的是基类类型。

指针之间 的转换必须得是继承的关系。没有任何关系的指针之间不能转换

他可以将指向基类的指针转换为指向派生类的指针而且能够调用派生类的成员函数。

class A
{
public:
  virtual void say();
};

class B :public A
{
public:
  virtual void say();
  void say1();
  int i;
  std::string ii;
};
int main()
{
    A *a=new A;
    std::cout<<"Aa  "<<a<<"  sizeof  "<<sizeof(*a)<<std::endl;
    B *b=static_cast<B*>(a);
    std::cout<<"Bb  "<<a<<"  sizeof  "<<sizeof(*b)<<std::endl;
    b->say1(); 
    b->say();    
    std::cout<<"b.i "<<b->i<<std::endl;
}

输出

从输出来看,指针相同,但是大小不同。可以看出应该是扩充出来的。

从执行的函数来看,如果基类有这个函数,就执行基类的。否则执行转型类的。

但是,从B的i的值可以看出,类并没有初始化。即使在默认构造函数中赋值,也不会初始化。

如果类B内,有必须要初始化的变量,比如const之类的,编译器会报错。

不知道,为什么能这样。

同时也可以增加变量的常量性

const_cast<T>(exp)

去除变量的const

    const B * const b=new B;
    std::cout<<"b.i "<<b->i<<" size "<<sizeof(*b)<<std::endl;
    std::cout<<"b p "<<b<<std::endl;
    B *c=const_cast<B*>(b);
    c->i=2;
    std::cout<<"change"<<std::endl;

    std::cout<<"b.i "<<b->i<<" size "<<sizeof(*b)<<std::endl;
    std::cout<<"b p "<<b<<std::endl;

输出

image.png

从输出来看,确实是修改了。而且确实是在原来对象上修改的。

reinterpret_cast<t>(exp)

重新解释

    int i1(0);
    int i(0);
    
    std::cout<<"int i size "<<sizeof(i)<<" piont "<<&i<<std::endl;
    std::cout<<"int i1 size "<<sizeof(i)<<" piont "<<&i1<<std::endl;
    double *c=reinterpret_cast<double *>(&i);
    std::cout<<"double c size "<<sizeof(*c)<<" piont "<<c<<std::endl;

    std::cout<<"c  "<<*c<<std::endl;

输出


image.png

取后者大小的地址,对其进行重新解释。

implicit_cast<>()

这是boost库中的转型。yu

相关文章

  • 新式转型标识符

    一、dynamic_cast(exp) 用于运行时检查该转换是否类型安全基类指针或引用向子类转换只能操作指针...

  • python | 不同应用下什么是标识符、保留字?

    标识符和保留字 ① Python标识符 ② Python保留字 一、标识符 1、什么是标识符 标识符(Identi...

  • LLVM IR介绍

    官方链接 标识符 LLVM的标识符有两类:全局标识符和局部标识符。全局标识符以符号@开头,局部标识符由符号%开头。...

  • 从零开始学Java(五)Java标识符、关键字和变量

    一、标识符 1、标识符可以标识什么,什么是标识符,怎么理解这个概念! 2、标识符的命名规则 3、标识符的命名规范 ...

  • 新学校,新式样,新气象

    新学校,新式样,新气象 ——2020沭阳新式学校筹建参考 ...

  • 新式类与经典类

    新式类:继承于object的类都是新式类。 经典类:不是继承object的类都是经典类 在多继承中,新式类采用广度...

  • 新式类和旧式类区别

    Python中类分两种:旧式类和新式类:➤新式类都从object继承,经典类不需要。 ➤新式类的MRO(metho...

  • python super用法 2018-01-28

    新式类,经典类 python3之后均称为新式类,默认继承object类 Python2.x版本分为:分新式类与经典...

  • iOS之C语言如何快速了解标识符

    本章基本概括 1.什么是标识符以及标识符的作用2.标识符起名规则3.标识符命名惯例(驼峰命名法) 一,什么是标识符...

  • Python 类

    新式类和旧式类 在python2.x的版本中,有“新式类”和“旧式类(也叫做经典类)”之分。新式类是python2...

网友评论

      本文标题:新式转型标识符

      本文链接:https://www.haomeiwen.com/subject/uillrxtx.html