文章目录
- 一、类型转换简介
- 二、示例
- 1.隐式类型转换
- 2.强制类型转换
一、类型转换简介
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;
}