最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

【全球独家】63.C++类型转换

来源:博客园

类型转换(cast)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。

转换是非常有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一个比它更大的类型,但这可能会破坏其他的数据。

应该小心类型转换,因为转换也就相当于对编译器说:忘记类型检查,把它看做其他的类型。


(资料图)

一般情况下,尽量少的去使用类型转换,除非用来解决非常特殊的问题。

无论什么原因,任何一个程序如果使用很多类型转换都值得怀疑。

标准c++提供了一个显示的转换的语法,来替代旧的C风格的类型转换。

使用C风格的强制转换可以把想要的任何东西转换成我们需要的类型。那为什么还需要一个新的C++类型的强制转换呢?

新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。

//2023年3月10日19:52:46#pragma warning(disable:4996)#define _CRT_SECURE_NO_WARNINGS 1#include #include using namespace std;//静态转换//1.基础类型转换void test01(){    char a = "a";    //char->double;    //static_cast<目标类型>(待转类型)    double d = static_cast(a);    //double d1 = (double)a;}//2.有层次关系的类的指针或引用转换class Father{};class Son :public Father{};class Other{};void test02(){    Father* f = NULL;    Son* s = NULL;    //向下转换,不安全    static_cast(f);    //向上转换,安全    Father* f1 = static_cast(s);    //没有继承关系的类之间的指针不能转换    //Other* o = static_cast(s);}//引用转换void test03(){    Father f;    Son s;    Father& ref_f = f;    Son& ref_s = s;    //向上转换,安全    static_cast(ref_s);    //向下转换,不安全    static_cast(ref_f);}//动态转换void test04(){    //char a = "a";    //dynamic_cast(a);//基础数据类型不能使用动态转换    Father* f = NULL;    Son* s = NULL;    //向上,安全    Father* f1 = dynamic_cast(s);    //向下,不安全,会检查    //Son* s1 = dynamic_cast(f);}class Father2{public:    virtual void func() {};};class Son2 :public Father2{public:    virtual void func() {};};//发生多态时,向下转换,动态转换就可以void test05(){    Father2* f = new Son2;    dynamic_cast(f);}//常量转换void test06(){    const int* p = NULL;    //const-->不带const    int* newP = const_cast(p);    int* pp = NULL;    const int* newPP = const_cast(pp);}//重新解释转换void test07(){    int a = 10;    int* p = reinterpret_cast(a);    Father* f = NULL;    Other* o = reinterpret_cast(f);}int main(){    test05();    system("pause");    return EXIT_SUCCESS;}

1.静态转换(static_cast)

●用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

▷进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

▷进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

●用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要开发人员来保证。

class Animal{};class Dog : public Animal{};class Other{};//基础数据类型转换void test01(){char a = "a";double b = static_cast(a);}//继承关系指针互相转换void test02(){//继承关系指针转换Animal* animal01 = NULL;Dog* dog01 = NULL;//子类指针转成父类指针,安全Animal* animal02 = static_cast(dog01);//父类指针转成子类指针,不安全Dog* dog02 = static_cast(animal01);}//继承关系引用相互转换void test03(){Animal ani_ref;Dog dog_ref;//继承关系指针转换Animal& animal01 = ani_ref;Dog& dog01 = dog_ref;//子类指针转成父类指针,安全Animal& animal02 = static_cast(dog01);//父类指针转成子类指针,不安全Dog& dog02 = static_cast(animal01);}//无继承关系指针转换void test04(){Animal* animal01 = NULL;Other* other01 = NULL;//转换失败//Animal* animal02 = static_cast(other01);}

2.动态转换(dynamic_cast)

●dynamic_cast主要用于类层次间的上行转换和下行转换;

●在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;

●在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全;

class Animal {public:virtual void ShowName() = 0;};class Dog : public Animal{virtual void ShowName(){cout << "I am a dog!" << endl;}};class Other {public:void PrintSomething(){cout << "我是其他类!" << endl;}};//普通类型转换void test01(){//不支持基础数据类型int a = 10;//double a = dynamic_cast(a);}//继承关系指针void test02(){Animal* animal01 = NULL;Dog* dog01 = new Dog;//子类指针转换成父类指针 可以Animal* animal02 = dynamic_cast(dog01);animal02->ShowName();//父类指针转换成子类指针 不可以//Dog* dog02 = dynamic_cast(animal01);}//继承关系引用void test03(){Dog dog_ref;Dog& dog01 = dog_ref;//子类引用转换成父类引用 可以Animal& animal02 = dynamic_cast(dog01);animal02.ShowName();}//无继承关系指针转换void test04(){Animal* animal01 = NULL;Other* other = NULL;//不可以//Animal* animal02 = dynamic_cast(other);}

3.常量转换(const_cast)

该运算符用来修改类型的const属性。。

●常量指针被转化成非常量指针,并且仍然指向原来的对象;

●常量引用被转换成非常量引用,并且仍然指向原来的对象;

注意:不能直接对非指针和非引用的变量使用const_cast操作符去直接移除它的const。
//常量指针转换成非常量指针void test01(){const int* p = NULL;int* np = const_cast(p);int* pp = NULL;const int* npp = const_cast(pp);const int a = 10;  //不能对非指针或非引用进行转换//int b = const_cast(a); }//常量引用转换成非常量引用void test02(){int num = 10;int & refNum = num;const int& refNum2 = const_cast(refNum);}

4.重新解释转换(reinterpret_cast)

这是最不安全的一种转换机制,最有可能出问题。

主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针.

关键词: