美文网首页
[C++进阶]最好使用C++转型操作符

[C++进阶]最好使用C++转型操作符

作者: 小鱼号的代码日记 | 来源:发表于2020-04-19 22:01 被阅读0次

static_cast 基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。不能够移除表达式的常量性(constness)

const_cast用来改变表达式中的常量性(constness)或易变性(volatileness)

const_cast 最常见的用途就是将某个对象的常量性去除掉

dynamic_cast 将"指向base class objects的pointers或references"转型为"指向dervied(或sibing base)class objects的pointers或references”,并得知转型是否成功。如果转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是references)表现出来。

Reinterpret_cast的最常用用途是转换“函数指针”类型,平台相关不具移植性,尽量避免使用。

/***************************
 more effectivre c++
 35个改善编程与设计的有效方法
 条款1:最好使用C++转型操作符
 ---------小鱼号的代码日记--------------
****************************/


/*****************************************
Static_cast 基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。
不能够移除表达式的常量性(constness)

Const_cast用来改变表达式中的常量性(constness)或易变性(volatileness)
const_cast 最常见的用途就是将某个对象的常量性去除掉

dynamic_cast 将"指向base class objects的pointers或references"转型为
"指向dervied(或sibing base)class objects的pointers或references”,
并得知转型是否成功。如果转型失败,会以一个null指针(当转型对象是指针)
或一个exception(当转型对象是references)表现出来。

Reinterpret_cast的最常用用途是转换“函数指针”类型
平台相关不具移植性,尽量避免使用。
*******************************************/

#include<iostream>
#include<vector>
using namespace std;

class Widget{
public:
    virtual ~Widget(){}
};
class SpecialWidget:public Widget{
public:
    virtual ~SpecialWidget(){}
};
void update(SpecialWidget *psw){}
void updateViaRef(SpecialWidget &rsw){}
int doSomething(){}
int main()
{
   SpecialWidget sw;              //sw是一个non_const对象
   const SpecialWidget& csw = sw; //csw却是一个代表sw的reference,
                                  //并视为一个const对象
   ///update(&csw);               //错误!不能将const SpecialWidget*
                                  ///传给一个需要SpecialWidget*的函数。
   update(const_cast<SpecialWidget*>(&csw)); //可 &csw的常量性被去除了。也因此
                                             //csw(亦即sw)在此函数中可能被更改

   update((SpecialWidget*)(&csw)); //情况同上,但是使用的是较难辨识的
                                   //C旧式转型语法

   Widget *pw = new SpecialWidget;
   ///update(pw);                     //错误!pw的类型是Widget* 但
                                     //update()需要的却是SpceicalWidget*

   ///update(const_cast<SpecialWidget*>(pw));//错误!const_cast只能用来影响
                                             //常量性或易变性,无法进行继承体系的
                                             //向下(cast down)动作
   ///const_cast 最常见的用途就是将某个对象的常量性去除掉

   update(dynamic_cast<SpecialWidget*>(pw));//很好,传给update()一个指针,指向pw
                                            //所指的SpecialWidget
                                            //如果pw真的指向这样的东西;否则传过去
                                            //的将是一个null指针
   updateViaRef(dynamic_cast<SpecialWidget&>(*pw));//很好,传给updateViaRef()的是pw
                                            //所指的SpecialWidget
                                            //如果pw真的指向这样的东西;否则传过去
                                            //抛出一个exception。
   ///dynamic_cast 只能协助你巡航于继承体系中。它无法应用在缺乏虚函数的类型身上
   /// 也不能改变类型的常量性

   int firstNumber,seconeNumber;
   ///double result = dynamic_cast<double>(firstNumber)/seconeNumber;
                                             // 错误!未涉及继承机制
   {
   const SpecialWidget sw;
   ///update(dynamic_cast<SpecialWidget*>(&sw));
                                            //错误! dynamic_cast不能改变常量性
   }

   typedef void (*FuncPtr)();     //FuncPtr是个指针,指向某个函数。
                                  //后者无须任何自变量,返回值为void
   FuncPtr funcPtrArray[10];      //funcPtrArray是个数组 内有10个FuncPtrs


   ///funcPtrArray[0] = doSomething;
                                //错误!类型不符

   funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); //可以编译通过

   ///Reinterpret_cast的最常用用途是转换“函数指针”类型
   ///平台相关不具移植性,尽量避免使用。
   return 0;
}

内容选自:
more effectivre c++
35个改善编程与设计的有效方法

相关文章

  • [C++进阶]最好使用C++转型操作符

    static_cast 基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。不能够移除表达式的常量性(cons...

  • c++_动态对象创建

    一.c语言 c语言使用malloc 来创建堆对象 二.c++ new操作符 delete操作符 如果new []...

  • C++转型操作符

    旧式的C转型的缺点: 几乎允许将任何类型转换为任何其他类型,例如,改变对象的常量性或者对象的类型。 难以辨识,语法...

  • Kotlin --- Operator Overloading

    简述 Kotlin的操作符重载与C++类似,虽然没有C++那么强大,但是仍然可以实现Kotlin的操作符重载。 操...

  • C++ 点(.)操作符和箭头(->)操作符

    初写C++代码时, 在访问类的成员变量时候,看到有些地方使用(.)操作符,而有的地方又使用箭头(->)操作符。并且...

  • Geekband C++ 第五周

    概述 C++模板简介 函数模板 C++类模板 操作符重载 泛型编程 容器

  • Coursera C++ Part B [Week1] C++进

    C++ Part B是C++进阶课程,bf课程网址 https://www.coursera.org/learn/...

  • C++学习笔记(七)操作符重载(上)

    1、基本操作符重载 操作符重载指的是将C++提供的操作符进行重新定义,使之满足我们所需要的一些功能。 在C++中可...

  • Java操作符

    在最底层,Java中的数据是通过使用操作符来操作的。Java是建立在C++基础上的,所以C和C++程序员应该非常熟...

  • FFmpeg - 打造一款万能的音乐播放器

    从 c/c++ 基础、jni 基础、c/c++ 进阶、数据结构和算法、linux 内核、CMake 语法、Shel...

网友评论

      本文标题:[C++进阶]最好使用C++转型操作符

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