一、隐式类型转换和显示类型转换当等号两边的类型不同的时候、形参与实参类型不匹配的时候、返回值类型与接收返回值类型不一致时就需要发生类型转化。而类型转换又分为隐式类型转换和显示类型转换。123456789101112intmain(){// 隐式类型转换intIval 1;doubleDval Ival;// 显示类型转换int* p Ival;intpi p;// errorintpi (int)p;return0;}隐式类型转换是编译器在编译阶段自动进行能转就转不能转就编译失败。而显示类型转换就要我们自己处理。二、C的四种类型转换上面的两种类型转换是C语言风格的存在一些缺点。隐式类型转换会造成精度的丢失。而显示类型转换则会导致转换不清晰不知道谁转化过来。所以C提供了规范的四种类型转换2.1 static_cast 相似转化如果想要进行相似类型的转换编译器隐式执行的任何类型转换都可用。但是如果是两个不相关的类型就不能转换。12345678intmain(){inti 0;doubled static_castint(i);int* p nullptr;intpi static_castint(p);// errorreturn0;}2.2 reinterpret_cast 不同类型转化上面我们用指针类型转化成整型出现错误而这种不同类型的转换要用reinterpret_cast。12345678910intmain(){inti 0;doubled static_castint(i);int* p nullptr;intpi static_castint(p);// errorintpi reinterpret_castint(p);// correctreturn0;}2.3 const_cast 去除const属性使用const_cast的主要目的是为了去除一个const变量的const方便赋值。12345678intmain(){constinti 1;int* p const_castint*(i);*p 3;cout i endl;return0;}这里的结果需要注意一下这里是因为编译器把这个变量放到了寄存器中我们修改的是内存中的数据不影响寄存器我们可以加上volatile关键字每次都去内存中取来看看12345678intmain(){volatileconstinti 1;int* p const_castint*(i);*p 3;cout i endl;return0;}2.4 dynamic_cast 向下转换dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)在前面的文章【C】继承中讲过子类对象赋值给父类 对象/指针/引用这里有个形象的说法叫切片或者切割寓意把派生类中父类那部分切来赋值过去。但是如果我们直接把父类类传递给子类会不安全因为父类转给子类会多开一份空间可能会越界访问。12345678910111213141516171819202122232425262728293031classA{public:virtualvoidf() {}public:int_a 0;};classB :publicA{public:int_b 0;};voidfun(A* pa){B* pb (B*)pa;pb-_a;pb-_b;}intmain(){A a;B b;fun(a);fun(b);return0;}而加上dynamic_cast后如果转化失败就会返回空指针让我们检查123456789101112131415161718192021222324252627282930313233classA{public:virtualvoidf() {}public:int_a 0;};classB :publicA{public:int_b 0;};voidfun(A* pa){B* pb dynamic_castB*(pa);cout pb endl;if(pb){pb-_a;pb-_b;}}intmain(){A a;B b;fun(a);fun(b);return0;}但是这里要注意dynamic_cast只能用于父类含有虚函数的类
C++的四种类型转换
一、隐式类型转换和显示类型转换当等号两边的类型不同的时候、形参与实参类型不匹配的时候、返回值类型与接收返回值类型不一致时就需要发生类型转化。而类型转换又分为隐式类型转换和显示类型转换。123456789101112intmain(){// 隐式类型转换intIval 1;doubleDval Ival;// 显示类型转换int* p Ival;intpi p;// errorintpi (int)p;return0;}隐式类型转换是编译器在编译阶段自动进行能转就转不能转就编译失败。而显示类型转换就要我们自己处理。二、C的四种类型转换上面的两种类型转换是C语言风格的存在一些缺点。隐式类型转换会造成精度的丢失。而显示类型转换则会导致转换不清晰不知道谁转化过来。所以C提供了规范的四种类型转换2.1 static_cast 相似转化如果想要进行相似类型的转换编译器隐式执行的任何类型转换都可用。但是如果是两个不相关的类型就不能转换。12345678intmain(){inti 0;doubled static_castint(i);int* p nullptr;intpi static_castint(p);// errorreturn0;}2.2 reinterpret_cast 不同类型转化上面我们用指针类型转化成整型出现错误而这种不同类型的转换要用reinterpret_cast。12345678910intmain(){inti 0;doubled static_castint(i);int* p nullptr;intpi static_castint(p);// errorintpi reinterpret_castint(p);// correctreturn0;}2.3 const_cast 去除const属性使用const_cast的主要目的是为了去除一个const变量的const方便赋值。12345678intmain(){constinti 1;int* p const_castint*(i);*p 3;cout i endl;return0;}这里的结果需要注意一下这里是因为编译器把这个变量放到了寄存器中我们修改的是内存中的数据不影响寄存器我们可以加上volatile关键字每次都去内存中取来看看12345678intmain(){volatileconstinti 1;int* p const_castint*(i);*p 3;cout i endl;return0;}2.4 dynamic_cast 向下转换dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)在前面的文章【C】继承中讲过子类对象赋值给父类 对象/指针/引用这里有个形象的说法叫切片或者切割寓意把派生类中父类那部分切来赋值过去。但是如果我们直接把父类类传递给子类会不安全因为父类转给子类会多开一份空间可能会越界访问。12345678910111213141516171819202122232425262728293031classA{public:virtualvoidf() {}public:int_a 0;};classB :publicA{public:int_b 0;};voidfun(A* pa){B* pb (B*)pa;pb-_a;pb-_b;}intmain(){A a;B b;fun(a);fun(b);return0;}而加上dynamic_cast后如果转化失败就会返回空指针让我们检查123456789101112131415161718192021222324252627282930313233classA{public:virtualvoidf() {}public:int_a 0;};classB :publicA{public:int_b 0;};voidfun(A* pa){B* pb dynamic_castB*(pa);cout pb endl;if(pb){pb-_a;pb-_b;}}intmain(){A a;B b;fun(a);fun(b);return0;}但是这里要注意dynamic_cast只能用于父类含有虚函数的类