1) 显示转换
用以下转换的好处之一是,容易找出程序中所有的转换,C风格的转换用()去转换,很难查找。
l static_cast
1) 用于替代C风格的显式转换如long b = (int) a;
各种类型指针到void*的转换。
long b = static_cast<int>(a);
2) 用于父类到子类指针的转换
3) 不能在类层次外转换,所以static_cast比C方式转换安全。
l const_cast
从const转为非const,或者volatile转为非volatile。
通过const指针是不能改变数据的,有时候,如果想改,就得转为非const。
l reinterpret_cast
这是最不安全的转换,但很强大,有时候甚至可以将一段buffer转成一个类的对象指针,或者反过来。
class A;
A a;
char* pBuffer = reinterpret_cast<char*> (&a);
l dynamic_cast
1) 只有类中含有虚函数才能用dynamic_cast,因为其是依赖于VTable来工作的。
2) 用于多态类型的转换,比如从父类到子类的转换。
3) 当明确知道子类的类型时,可用static_cast转换,其效率高点。
关于虚函数,请参考
http://blog.csdn.net/yeming81/archive/2010/06/16/5673139.aspx
2) 自动转换
自动类型转换只作用于函数调用参数转换中,而不能在函数选择时。
比如a.Func1();a不能自动转换成别的类型A,从而调用A的函数Func1。
l 构造函数
class A
{
public:
A(int a){}
}
void Func(A a);
Func(1); //自动转换
好处是只定义一个函数,方便;坏处是容易造成
混淆。
如果想禁止这种转换,可将构造函数声明为
explicit,定义不用加。
explicit A(int a) ;
l ( )重载
详细请参考
http://blog.csdn.net/yeming81/archive/2010/06/16/5673181.aspx