C++总结笔记(十三)—— 类型转换


一、类型转换简介

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;
}
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值