Item:尽可能少做类型转换

C风格类型转换

double dValue = 3.3;

int nValue = (double)dValue;


C++风格类型转换

double dValue = 3.3;

int nValue = static_cast<int>(dValue);

 

优点,容易识别,特别是被工具识别; 分工明确,易于在编译时识别错误。


4种C++类型转换

static_cast:强迫隐形转型

dynamic_cast:安全向下类型转换,效率较差

const_cast:将对象常量性移除

reinterpret_cast:意图进行低级转型


dynamic_cast

class Base
{
public:
    Base();
    virtual ~Base();
    
    virtual void function1();
}

class Derived : public Base
{
public:
    Derived();
    ~Derived();
    virtual void function1();
    function2();
}
 
int main()
{
    Base* pBasePointer = new Derived();
    pBasePointer->function1(); // 调用虚函数直接调用
    dynamic_cast<Derived*>(pBasePointer)->function2(); //调用非虚子类函数,虽然是指向子类对象,但还是需要做一个强制转换
}

 

使用dynamic_cast做强制转换是效率比较低的,应避免使用,可以使用下面这两种方法避免

a. 直接使用子类的指针

Derived* pDerivedPoint = new Derived();

pDerivedPoint->function2();


b. 改为virtual函数


 

类型转换后实际是产生了一个副本,本身并没有改变,比如下面例子,调用的是一个副本的OnSizeChange,而不是本身基类的这个函数。

class window
{
 vitual void OnSizeChange();
}

class derivedWindow : public window
{
 virtual void OnSizeChange()
 {
  static_cast<window>(*this).OnSizeChange(); //调用的是一个副本的OnSizeChange,而不是本身基类的这个函数。
 }
}


正确写法

class derivedWindow : public window
{
 virtual void OnSizeChange()
 {
  window::OnSizeChange(); //直接告诉编译器需要调用基类的这个函数
  ... ... 
 }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值