c/c++基础篇之数据类型转换

C/C++常见的数据类型转换

1.      常见的单类基本类型转换

(1)强制类型转换

如: int a=(int)(9.87)  结果a=9

 char c=(char)(97)  结果为c=’a’

  特别注意的是,在c++11中,增加了auto关键字,转换类型相对智能化

     auto c=(int)(9.87)   结果c=9

(2)string与char * ,char arr[]

String----const char *

  c_str()生成一个constchar*指针,指向以空字符终止的数组。

  例1:const char *c;  string s=”1234”; c=s.c_str();cout<<c;  输出结果为1234

  例2:string str=”lol”; char * ptr=new char[str.length()+1]; strcat(ptr,str)

 

String---char s[]

  可以利用strcpy函数(需先转换成constchar *)或者利用循环对字符数组逐一赋值

  例:string s(‘test’);char str[10];

 strcpy(str,s.c_str())

 for(inti=0;i<s.length();i++) {str[i]=s[i]}

 

char s[]与char *------string

  可以直接赋值 char *ptr; char arr[];  string s1=ptr;  string s2=arr;

                 

(3)char *与int

   头文件:#include<stdlib.h>

atoi() 函数用来将字符串转换成整数(int),其原型为:intatoi (const char * str);

例:char *numchars="1234"; int num=atoi(numchars);  结果为1234

 

itoa()函数用于整数到字符串的转换,其原型为:char*itoa(int value, char *string, int radix);

例:int num=1234;  int radix=8;  char res[20];  itoa(num,res,radix);

    printf("%d(10)=%s(%d)\n",num,res,radix);//输出1234(10)=2322(8) 这里radix指的是进制

 

同时c++还提供标准库函数有:long int atol ( const char * str ); double atof (constchar* str);

stof()、strtod()、strtol()、strtoul()、atoll()、strtof()、strtold()、strtoll()、strtoull(),详情可在网上查阅。

(4)string与int

   利用stoi()直接转换

   例:string s=”1234”;int b=stoi(s)  结果为1234

   利用atoi()间接转换

   例:string s=”1234”;int b=atoi(s.c_str())  结果为1234

 

(5)sprintf作用是将printf的输出结果保存在字符串数组中。

         

2.一些特殊的数据类型转换

(1)type b= static_cast<type>(a) 将type1 a的类型转化为type2 b的类型;

使用范围:完成编译器认可的隐式类型转换,但不支持指针与常见的int、float等类型转换。

①基本数据类型之间的转换,如int->double;

int a = 6;

double b = static_cast<int>(a);

②派生体系中向上转型:将派生类指针或引用转化为基类指针或引用(向上转型);

class base{       ….    }

class derived : public base{      ….    }

base *b;

derived *d = new derived();

b = static_cast<base *>(d);

(2) dynamic_cast

功能:执行派生类指针或引用与基类指针或引用之间的转换。

格式:

①其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行运行时类型检查;

②不能用于内置的基本数据类型的强制转换。 dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

③使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。

这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念)中,只有定义了虚函数的类才有虚函数表。

④在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比 static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。可以实现向上转型和向下转型,前提是必须使用public或protected继承;

例子:

向上转型:

class base{       …     };

class derived : public base{      …     };

int main()

{

base *pb;

derived *pd = new derived();

pb = dynamic_cast<base *>(pd);

return 0;

}

 

向下转型:

class base{       virtualvoid func(){}           };

class derived : public base{      void func(){}      };

int main()

{  base*pb = new base();

derived *pd = dynamic_cast<derived*>(pb);//向下转型

return 0;  }

(3) const_cast

只能对指针或者引用去除或者添加const属性,对于变量直接类型不能使用const_cast;不能用于不同类型之间的转换,只能改变同种类型的const属性。

如:

const int a= 0;   int b = const_cast<int>(a);//不对的

 

const int *pi = &a;  int * pii = const_cast<int *>pi;//去除指针中的常量性,也可以添加指针的常量性;

const_cast的用法:const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。

(4)reinterpret_cast

interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值.有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。


原文链接:https://blog.csdn.net/xiaomu_347/article/details/80584263

posted on 2019-10-11 08:23  潇潇六月雨  阅读(366)  评论(0编辑  收藏  举报

导航