一、类型转换简介
C++中类型转换从形式上可分为显式和隐式两种。
隐式类型转换则是由编译器自动完成类型转换过程,可以分为内置数据类型转换和自定义数据类型转换。
显式的类型转换通常使用强制类型转换操作符如static_cast、reinterpret_cast、const_cast、dynamic_cast来完成。
static_cast表示静态类型转换,既可以进行基础类型之间的转换,也可以完成自定义类型转换操作符以及父类子类间指针的类型转换。但static_cast 进行转换时不进行安全检查,使用时非常危险,因此引入 dynamic_cast转换。
reinterpret_cast表示可以将C++内置数据类型转换为任何类型,也可以进行指针的类型的转换,一般不用,太容易出问题。
const_cast表示将常量类型转化为非常量类型。
dynamic_cast表示动态类型转换,常用于指针间的转换。需要注意父类指针转换子类对象时,基类中一定要有虚函数,否则会报错。
二、示例
1.隐式类型转换
//隐式类型转换(内置数据类型)
void testImplicitConvert()
{
//算数计算
int a = 1;
double b = a;
cout << typeid(b).name() << endl;
}
//隐式类型转换(自定义类型)
class Boy
{
public:
Boy(const string& Name) : name(Name){};
void PlayWith(const Boy& b);
private:
string name;
};
void Boy::PlayWith(const Boy& b)
{
if (b.name == name)
{
cout << "和"<< b.name << "玩" << endl;
}
else
{
cout << "和" << b.name<< "玩" << endl;
}
}
int main()
{
testImplicitConvert();
Boy A("杨洋");
Boy B("许嵩");
A.PlayWith(B);
A.PlayWith(string("杨洋"));
system("pause");
return 0;
}
double
和许嵩玩
和杨洋玩
2.强制类型转换
//静态类型转换(父类子类)
class Person
{
public:
int Age;
};
class Girl : public Person
{
};
//静态类型转换(内置数据类型)
void test1()
{
int a = 1;
double b = static_cast <double> (a);
cout << typeid(b).name() << endl;
Person* p1 = new Person;
Girl* p2 = new Girl;
Girl* p3 = static_cast <Girl*> (p1); // 不安全
Person* p4 = static_cast <Person*> (p2); // 安全
}
//动态类型转换
void test2()
{
Person* p1 = new Person;
Girl* p2 = new Girl("迪丽");
//父类转换为子类
/*Girl* p3 = dynamic_cast <Girl*> (p1); */ // 报错,父类需要使用多态,即虚函数
//子类可以转换为父类
Person* p4 = dynamic_cast <Person*> (p2); // 安全
cout << p2->Name << endl;
cout << p4->Name << endl;
}