muduo网络库学习笔记(二):base库之 Types.h

基本类型的声明,包括muduo::string

类型转换 implicit_cast 和 down_cast


1. 基本类型的声明

using std::string;
//简化了用 memset 初始化的使用
inline void memZero(void* p,size_t n){
    memset(p,0,n);
}

隐式类型转换:隐式类型转化是编译器默默地、隐式地、偷偷地进行的类型转换,这种转换不需要程序员干预,会自动发生,比如赋值转换 float f = 100;

强制类型转换: C++中有四种强制转换 const_cast,static_cast,dynamic_cast,reinterpret_cast

 

在类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换时,

进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

2.1 implicit_cast 隐式转换

template<typename To,typename From>
inline To implicit_cast(From const &f){
    return f;
}

implicit_cast 是一个简单的隐式转换。

原型:

implicit_cast<ToType>(expr)

用法:

int i = 3;
implicit_cast<double>(i);

用处:

用于在继承关系中, 子类指针转化为父类指针;隐式转换inferred 推断,因为 from type 可以被推断出来,所以使用方法和 static_cast 相同在up_cast时应该使用implicit_cast替换static_cast,因为前者比后者要安全。

以一个例子说明,在菱形继承中,static_cast把最底层的对象可以转换为中层对象,这样编译可以通过,但是在运行时可能崩溃

implicit_cast就不会有这个问题,在编译时就会给出错误信息

2.2 down_cast 向下转换

template<typename To,typename From>
inline To down_cast(From const *f){
 
#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI)
    assert(f == NULL || dynamic_cast<To>(f) != NULL);  // RTTI: debug mode only!
#endif
    
    return static_cast<To>(f);
}

down_cast在debug模式下内部使用了dynamic_cast进行验证,在release下使用static_cast替换dynamic_cast。

为什么使用down_cast而不直接使用dynamic_cast?

1.因为但凡程序设计正确,dynamic_cast就可以用static_cast来替换,而后者比前者更有效率。

2.dynamic_cast可能失败(在运行时crash),运行时RTTI不是好的设计,不应该在运行时RTTI或者需要RTTI时一般都有更好的选择。


版权声明:本文为qq_39898877原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。