当前位置:文档之家› 数据类型转换

数据类型转换

数据类型转换一、隐式类型转换1)简单数据类型(1)算术运算转换为最宽的数据类型eg:[cpp] view plain copy#include <iostream>using std::cout;using std::endl;int main(int argc, char* argv[]){int ival = 3;double dval = 3.14159;cout << ival + dval << endl;//ival被提升为double类型return 0;}其运行结果:6.14159int main(int argc, char* argv[]){010D17D0 push ebp010D17D1 mov ebp,esp010D17D3 sub esp,0DCh010D17D9 push ebx010D17DA push esi010D17DB push edi010D17DC lea edi,[ebp-0DCh]010D17E2 mov ecx,37h010D17E7 mov eax,0CCCCCCCCh010D17EC rep stos dword ptr es:[edi]int ival = 3;010D17EE mov dword ptr [ival],3double dval = 3.14159;010D17F5 movsd xmm0,mmword ptr [__real@400921f9f01b866e (010D6B30h)]010D17FD movsd mmword ptr [dval],xmm0cout << ival + dval << endl;//ival被提升为double类型010D1802 mov esi,esp010D1804 push offset std::endl<char,std::char_traits<char> > (010D1064h)010D1809 cvtsi2sd xmm0,dword ptr [ival]010D180E addsd xmm0,mmword ptr [dval]010D1813 mov edi,esp010D1815 sub esp,8010D1818 movsd mmword ptr [esp],xmm0010D181D mov ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (010D90A8h)] 010D1823 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (010D90A0h)]010D1829 cmp edi,esp010D182B call __RTC_CheckEsp (010D111Dh)010D1830 mov ecx,eax010D1832 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (010D90A4h)]010D1838 cmp esi,esp010D183A call __RTC_CheckEsp (010D111Dh)return 0;010D183F xor eax,eax}010D1841 pop edi}010D1842 pop esi010D1843 pop ebx010D1844 add esp,0DCh010D184A cmp ebp,esp010D184C call __RTC_CheckEsp (010D111Dh)010D1851 mov esp,ebp010D1853 pop ebp010D1854 ret(2)赋值转换为被赋值对象的类型,但不会改变赋值对象的数据类型。

eg:[cpp] view plain copy#include <iostream>using std::cout;using std::endl;int main(int argc, char* argv[]){int ival = 4;double dval = 3.14159;ival = dval; // double->intcout << dval << endl;cout << ival << endl;return 0;}其运行结果:3.141593注意:数据类型窄化转换时,注意数据溢出及丢失。

(3)函数传参当实参与形参数据类型不同时,转换为形参数据类型。

eg:[cpp] view plain copy#include <iostream>using std::cout;using std::endl;double square(double dval);int main(int argc, char* argv[]){cout << square(5) << endl;return 0;}double square(double dval){return dval * dval;}其运行结果:25(4)函数返回当返回类型与表达式类型不同时,转换为返回类型。

eg:[cpp] view plain copy#include <iostream>using std::cout;using std::endl;double difference(int ival1, int ival2);int main(int argc, char* argv[]){int ival1 = 2;int ival2 = 3;cout << difference(2, 3) << endl;return 0;}double difference(int ival1, int ival2){return ival1 - ival2; //返回值被提升为double类型}其运行结果:-12)类类型(1)单参数构造函数(2)赋值操作符(3)类型转换操作符eg:[cpp] view plain copy// implicit conversion of classes:#include <iostream>using std::cout;using std::endl;class A {};class B {public:// conversion from A (constructor)B(const A& x){cout << "Conversion from A (constructor)" << endl;}// conversion from A (assignment)B& operator= (const A& x){cout << "Conversion from A (assignment)" << endl;return *this;}// conversion to A (type-cast operator)operator A(){cout << "Conversion to A (type-cast operator)" << endl;return A();}};int main(int argc, char* argv[]){A foo;B bar = foo; // calls constructorbar = foo; // calls assignmentfoo = bar; // calls type-cast operatorreturn 0;}其运行结果:Conversion from A (constructor)Conversion from A (assignment)Conversion to A (type-cast operator)二、显示类型转换1)C风格dst = (T)src[cpp] view plain copy#include <iostream>using std::cout;using std::endl;int main(int argc, char* argv[]) {int ival;double dval = 3.14159;ival = (int)dval; // double->intcout << dval << endl;cout << ival << endl;return 0;}其运行结果:3.1415932)函数风格dst = T(src)eg:[cpp] view plain copy#include <iostream>using std::cout;using std::endl;int main(int argc, char* argv[]) {int ival;double dval = 3.14159;ival = int(dval); // double->intcout << dval << endl;cout << ival << endl;return 0;}其运行结果:33)(1)static_casta、类层次结构中基类和派生类之间指针或者引用的转换。

up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。

b、基本数据类型之间的转换c、把空指针转换成目标类型的空指针(null pointer)d、把任何类型的表达式转换成void类型注意:不能转换掉表达式的const、volitale或者__unaligned属性。

eg1:[cpp] view plain copy#include <iostream>using std::cout;using std::endl;class Dummy{double i, j;};class Addition{int x, y;public:Addition(int a, int b) { x = a; y = b; }int result() { return x + y; }};int main(int argc, char* argv[]){Dummy d;Addition * padd;padd = (Addition*)&d;cout << padd->result();return 0;}其运行结果:-1717986920不做类型检查,转换没有安全性eg2:[cpp] view plain copy#include <iostream>using std::cout;using std::endl;class Dummy{double i, j;};class Addition{int x, y;public:Addition(int a, int b) { x = a; y = b; }int result() { return x + y; }};int main(int argc, char* argv[]){Dummy d;Addition * padd;padd = static_cast<Addition*>(&d);cout << padd->result();return 0;}(2)dynamic_cast转换类型与表达式类型相同,必须同时是类的指针、类的引用或void *.用于类的上行、下行及交叉转换。

相关主题