首页 > 编程 > C++ > 正文

C++显式转换(1)-static_cast

2019-11-06 06:31:40
字体:
来源:转载
供稿:网友

按照《C++程序设计语言》中的话来讲,static_cast运算符完成相关类型的转换。这个相关类型很微妙,还是举例说明吧。

假设有以下继承关系。

class Animal{};class Dog : public Animal{};class Cat : public Animal{};

我们首先进行简单的准备

Dog* dog = new Dog();Animal* animal = dog;

派生类类型的指针赋值给基类类型指针是不需要类型转换的,因为:

 Dog is a Animal

同理,因为上述判断不能成立,下面的转换需要使用static_cast。

Cat* cat1 = static_cast<Cat*>(dog);  //例1,NG

这一行会有编译错误,当然原因也应该好理解,因为Dog is not a Cat。接下来看下一个例子。

Dog* sdog = static_cast<Dog*>(animal);   //例2,OK

也许你会说没有问题,因为animal指向的本来就是Dog嘛。

但是,请看下一个例子。

Cat* cat2 = static_cast<Cat*>(animal);   //例3,OK???

虽然animal指向的是Dog对象,还是可以通过编译。

哪里错了?

例2的理解错了,animal实际指向的对象是什么,程序执行以后才知道(动态),static_cast只会进行静态检查,即

    Dog转换Cat可以么?不行,编译错误。

    Animal转换为Dog可以么?可能行,编译通过

    Animal转换为Cat可以么?可能行,编译通过

结论:staitc_cast可以对转换进行静态检查,帮我们查出一部分错误。

古人说:勿以恶小而为之,勿以善小而不为

发现错误当然越早越好,更何况是自动在便宜阶段。

如果不用强制类型转换当然更好。如果做不到,先从正确使用static_case/dynamic_cast/const_cast/reinterPRet_cast开始吧。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选