码迷,mamicode.com
首页 > 编程语言 > 详细

C++随记

时间:2020-06-13 15:51:35      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:新解   out   inter   span   ati   成员   调用   做什么   nbsp   

1.关于几种cast:

简单总结:

static_cast强制类型转换,基本类型间的类型转换安全,子类转父类安全,父类转子类不安全

reinterpret_cast直接重新解释二进制,非常不安全。

dynamic_cast只能转化指针或引用,并且其指向的对象包含虚函数,其主要作用是在运行期间,可以动态合法地将指向父类的指针转换为指向子类的指针,使之能访问子类的成员或函数,蜀国转化失败返回nullptr

const_cast用于丢弃常量指针/应用的const特性,即它们指向的对象可以被修改了(底层const),不能直接更改对象自身的const属性(顶层const)

 

技术图片

简单说,static_cast就是显式地强制转换,让编译器和其它开发者知道,开发者知道自己在做什么,了解转换可能不安全的风险。

首先了解顶层const的底层const:

技术图片

上面p1前的const是修饰p1这个指针,是顶层const,下面这个int *p2前的const修饰的是int,是底层const,指代其指向的是一个常量,不能修改,但p2本身可以修改。而const int &r这类的都是底层const,即指向的对象不可修改,自身可以修改。

技术图片

const_cast只能去除const指针或引用的const属性,且只能丢弃底层const(如下例) ,const_cast不是改变顶层const,const_cast<int>编译会报错

void ConstTest1(){
    const int a = 5;
    int *p;
    p = const_cast<int*>(&a);
    (*p)++;
    cout<<a<<endl;
    cout<<*p<<endl;

}
void ConstTest2(){
    const int a = 5;
    int &r = const_cast<int &>(a);
    r++;
    cout<<a<<endl;
}

void ConstTest3() {
  int a = 5;
  int * const pa = &a; // pa 自身是常量
  int ** p = const_cast<int**>(&pa); // 对p来说,该const_cast丢弃了其底层const(pa的const)
  int x = 10;
  (*p) = &x;
  cout << *pa << endl;
  cout << *(*p) << endl;
}

reinterpret_cast重新解释原来的二进制,非常危险,比static_cast更危险,static还会截断数位保持准备等行为(例如float->int.1.99->1),reinterpret_cast无法将float转为int,编译报错。

 

技术图片

 

 技术图片

 

 技术图片

 

 总之如果bp是一个基类的指针但是指向一个继承类,可以使用dynamic_cast转换为继承类后,可以用来调用继承类特有的函数或成员。

 

C++随记

标签:新解   out   inter   span   ati   成员   调用   做什么   nbsp   

原文地址:https://www.cnblogs.com/WonderHow/p/13114722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!