类型转换
·隐式类型转化
·显示类型转换
回顾C语言中的转换
//隐式转换:一般由表示范围小的类型转换为表示范围大的类型
int n = 10;
float f = n;
n = f; //反过来转换会出现截取的情况,有的编译器会警告,有的会报错
//截取会造成数据的精度的丢失
int* p = &n;
void* v = p; //隐式转换
p = (int*)v; //显式转换(强制类型转换)
c++中的四种类型转换
语法
xxx_cast <类型> (表达式)
一.static_cast
用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。
主要有如下:
1.基本数据类型转换
int转换成char
int n = 97;
cout << n << '\t' << (char)n << '\t' << static_cast<char>(n) << endl;
int转换成float
int n = 1;
cout << n/2 << '\t' << (float)n/2 << '\t' << static_cast<float>(n)/2 << endl;
指针/引用转换
void指针转换成目标类型的指针,这种转换是不安全的,也需要程序员来保证;
如下代码编译出错,因为不能把void*转换成其他具体指针。
void* pd = new Derive;
Base* pb = pd; // error: invalid conversion from ‘void*’ to ‘Base*’
pb->Print();
把Base* pb = pd;改为Base* pb = static_cast<Base*>(pd);,可以解决上述编译错误
2.int转换成enum
enum Week{
SUN,MON,TUE,WED,THU,FRI,SAT
};
Week day = static_cast<Week>(0); //week代表枚举的类型
3.基类和子类之间指针和引用的转换
·上行转换,把子类的指针或引用转换成父类,这种转换是安全的(通常使用默认转换)。
·下行转换,把父类的指针或引用转换成子类,这种转换是不安全的,也需要程序员来保证(通常使用dynamic_cast)
可以记为:爸爸大,儿子小,爸爸可以装下儿子,但是儿子不一定能装下爸爸
上行转换
已知存在继承关系的两个类Base与Derive:
class Base{ //定义一个父类
public:
void Print(){cout << "Base" << endl;}
};
class Derive:public Base{ //定义一个子类
public:
void Print(){cout << "Derive" << endl;}
};
int main(){
// 对象
Derive d;
Base b = static_cast<Base>(d);
b.Print();
// 引用
Base& fb = static_cast<Base&>(d);
fb.Print();
// 指针
Base* pb = static_cast<Base*>(new Derive); //子类指针必须指向父类对象
pb->Print();
}
通常使用隐式转换:
// 对象
Derive d;
Base b = d;
b.Print();
// 引用
Base& fb = d;
fb.Print();
// 指针
Base* pb = new Derive;
pb->Print();
下行转换
这种转换不安全,通常使用dynamic_cast
注意:static_cast跟传统小括号转换方式几乎是一致的
二.const_cast
常量赋值给非常量时,会出现下面编译错误:
<