C++中的强制类型转换:static_cast、reinterpret_cast、dynamic_cast、const_cast

     C语言中的强制类型转换就是TYPE a = (TYPE)b;将b强制转换为TYPE类型。而C++中有四个特有的强制类型转换方法:static_cast、reinterpret_cast、dynamic_cast、const_cast。

   static_cast:静态类型转换,如将int 类型转换成char类型。 static_cast做强制类型转换时,C++编译器会做类型检查,在C语言中能用隐式转换的,在C++中都可以用static_cast进行强制类型转换,因为C++编译器类型检查都会通过。

int main(){
    double num1=3.1415926;
    int num2=static_cast<int>(num1);
}

reinterpret_cast:重新解释类型。

在C语言中不同的指针类型之间是无法通过隐式转换的。这个时候在C++中就可以用reinterpret_cast,例如:

int main(){
    char *p1="Hello world";
    int *p2=reinterpret_cast<int *>(p1);
    cout<<p1<<endl;
    cout<<p2<<endl;
}
输出结果p1是字符串Hello world,p2的值是指针本身的值。

dynamic_cast:从命名上理解是动态类型转换,如子类和父类之间的多态类型转换。可以用dynamic_cast把子类转换成父类,也可以把父类转换成子类。两个不相关的类也可以用dynamic_cast进行类型转换。例如:

#include<iostream>
using namespace std;
class Animal
{
public:
    virtual void bark()=0;
};
class Dog:public Animal{
public:
    virtual void bark(){
        cout<<"WANGWANG"<<endl;
    }
    void Dog_Eating(){
        cout<<"I eat bone"<<endl;
    }
};
class Cat:public Animal{
public:
    virtual void bark(){
        cout<<"MIAOMIAO"<<endl;
    }
    void Cat_Eating(){
        cout<<"I eat fish"<<endl;
    }
};
void Play(Animal *test){
    test->bark();
    //dynamic_cast 能运行时进行类型识别
    //父类对象转为子类对象,也就是向下转型,如果转换失败,则dog为NULL
    Dog *dog = dynamic_cast<Dog*>(test);  
    if(dog!=NULL){
        dog->Dog_Eating();  //让Dog去做自己特有的工作
    }
    Cat *cat=dynamic_cast<Cat*>(test);
    if(cat!=NULL){
        cat->Cat_Eating();//让Cat去做自己特有的工作
    }
}
class man{
    virtual void eat(){
        cout<<"i eat orange"<<endl;
    }
};
int main(){
    Dog dog;
    Cat cat;
    Animal *animal=NULL;
    Play(&dog);
    Play(&cat);
    animal = &dog;
    animal=static_cast<Animal*>(&dog);
    animal=dynamic_cast<Animal*>(&dog);
    {
        man temp;
        //animal=static_cast<Animal*>(&temp);    //编译器会报错
        animal=dynamic_cast<Animal*>(&temp);  //将man类转换成Animal类,编译通过
    }
    system("pause");
       reutrn 0;
}

其实,也可以用static_cast进行子类和父类之间的类型转换,但是因为static_cast无法进行动态类型检查,所以是不安全的。

const_cast:字面上理解就是去掉原来的const属性。例如:

#include<iostream>
using namespace std;
void print(const char* buffer){
	char *temp=NULL;
	temp=const_cast<char *>(buffer);
	temp[1]='2';  
	//输出结果是H2llo world,即借助temp完成对buffer内容的修改。也相当于把const属性去掉
	cout<<buffer<<endl;

}
int main(){
	char buffer[]="Hello world";
//要保证buffer所指向的内存空间可以被修改,如果不能被修改,程序运行时会中断。
/*
char *p="Hello world";
print(p);
这两句运行的时候会出错,因为这个时候p所指向的内存空间是一个常量,不可以被修改
*/
       print(buffer);
	system("pause");
	return 0;
}

我们编程的时候要清楚变量原来是什么类型,要转换成是什么类型,类型转换后有什么后果。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值