C++中超恶心的类型转换

来源:互联网 发布:淘宝收藏夹在哪里 编辑:程序博客网 时间:2024/04/27 21:23

java中的类型转换不多言,以前从没注意类型


但CPP中的类型转换还是要多说几句了

一、首先先看一下CPP 中的强制转换

      1. static_cast     该函数可以实现int double float  char类型的互相转换,比较给力

        例如:

                int  a=4;

                float f=static_cast<float>(a);

  2. const_cast  把const类型的指针变为非const类型的指针 不多说,

    例如:

            const int *fun(int x,int y)

           {

           }  

            int *ptr=const_cast<int *>(fun(2.3));

   3.dynamic_cast

      该操作符用于运行时检查该转换是否类型安全,但只在多态类型时合法,即该类至少具有一个虚拟方法。dynamic_cast与      static_cast具有相同的基本语法,dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在  类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。如:

class C

{
  //…C没有虚拟函数
};
class T{
  //…
}
int main()
{
  dynamic_cast<T*> (new C);//错误
}
此时如改为以下则是合法的:
class C

{
public:
  virtual void m() {};// C现在是 多态
}

   4.reinterpret_cast

interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。如:int i; char *ptr="hello freind!"; i=reinterpret_cast<int>(ptr);这个转换方式很少使用。

二、其他类型转换

   1. int  double float转为string 

  int a;  //需要转换的int型数字 //double a;

  string int2string;

  stringstream ss;

  ss<<a;

  ss>>int2string;

    

    2.int 转char*

         int a=1325423423;
char aa[23];
      _itoa(a,aa,10);
cout<<aa<<endl;

   3. string类型转化为double,int,char类型         
       string strvar="3.1415926aa";         
       double dvar=atof(strvar.c_str());         
        cout<<"convert string to double "<<dvar<<endl;        
        string strvar="2007a";        
       int ivar=atoi(strvar.c_str());        
       cout<<"convert string to int "<<ivar<<endl;       
        string strvar="hello";     
       const char* cvar=strvar.c_str();//去掉const会报错        
       cout<<"convert string to char strvar="<<strvar<<" and cvar=";      
       for(int i=0;i<strvar.length();i++)               
      cout<<cvar[i];     
      cout<<endl;


_itoa atoi、atof、itoa、itow _itoa_s这类函数不多说了,查MSDN就很给力了

 CString也不说了


另外的:

string转char*

其他网站的

1.data
如:
string str="abc";
char *p=str.data();
2.c_str
如:
string str="gdfd";
   
 char *p=str.c_str();
3. copy
比如
string str="hello";
char p[40];
str.copy(p,
5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符
cout < <p;


评价:不知是我用VS2012的原因还是作者没有自己操作,我测试的结果是.data()和.c_str()都只能返回const char*。。。

copy的方法还是比较不错。


那就再说const char*转为char*  可以使用const_cast 。也可使用下述代码

const char *expr = "goodidea";
char *buf = new char[strlen(expr)+1];
strcpy(buf, expr); //这个函数好像林锐吃过苦头的

char*  to  string
例如:char *a="dafawegfasgasgasgasf";
      string s(a);

OK 暂时就写这么多。
原创粉丝点击