C++类型的隐式转换和显式转换

隐式转换:编译器根据需要自动转换变量类型。

1、一些基本类型的转换

double d = 82.0;
int i = d;

2、类的隐式转换,以下几种情况,类B能隐式转换成类A:

(1)B公有继承A,然后用子类去初始化基类

class B: class A{}
A a;
B b;
a =b;

(2)B中有类型转换函数
class B{
      operator A();
};
A a;
B b;
a = b;


(3)A实现了非explicit的参数为B的构造函数

class A{
     A(const B&);
};
A a;
B b;
a = b;


显示转换:也称为强制类型转换,要定义类型转换成要用的值的类型。如

int *ip;
char* pc = (char*)ip;
C++有四大强制类型转换符:reinterpret_cast, const_cast, static_cast, dynamic_cast.使用形式为:cast-name<type>(expression)

1、reinterpret_cast:最普通的强制类型转换符,与用圆括号将类型括起来实现一样

int* ip;
char* pc = reinterpret_cast<char*>(ip);

2、const_cast:去掉表达式的const性质

const char* pc_str;
char* pc = const_cast<char*>(pc_str); //新的表达式pc则消除了const性质


3、static_cast:编译器可以隐式转换的任何类型都可以由static_cast完成。仅当类型之间可隐式转换时(除类层次间的下行转换以外),static_cast才是合法的。咋一看这个static_cast显得有点多此一举了,但其实这样可以提高隐式转换的安全性。注意:C++基本类型(int,char等)的指针之间不能含有隐式转换,必须要用显示转换,所以如果static_cast里有基本类型的指针转换则是错误的。

class base{};
class child:public base{};
base* b;
child * c;
c = static_cast<child*>(b);  //下行转换,正确

char* p = str;
int* p1 = static_cast<int*>(p); 
//错误,指针不能有隐式转换,所以用static_cast也
//是错误的。

4、dynamic_cast:主要用于类层次间的上行转换和下行转换,也就是用于判断基类指针和子类指针的转换是否正确,如果错误则返回空指针。上行转换指用派生类去初始化基类,这是没问题的;下行转换,如果基类指针指向的是派生类,则转换成功,如果基类指针指向的是基类,则不能转换,返回空指针。dynamic_cast也可以用来转换兄弟类,如base1,base2相互转换。

dynamic_cast使用有几个前提:(1)type必须是类的指针、类的引用,或者void*(2)必须要有虚函数表,也就是说如果要进行类的类型转换,则必须是定义了虚函数的类。

class B{
public:
     B():b(1){}
     virtual void foo(){};
     int b;
}

class D:public B{
public:
     D():d(2){}
     int d;
}

void fun(B* pb){
     D* pd1 = dynamic_cast<D*>(pb);
}


上面这段代码,对于函数fun(pb),如果

B* pb = new D;
fun(pb);

则是正确的,因为基类的指针指向派生类,转换成功。而如果

B*pb = new B;
fun(pb);

则是错误的,因为基类的指针指向基类,不能用基类去初始化派生类,所以错误,此时pd1将返回空指针,将会发生异常,从而能够更早的发现错误。









  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值