返回顶部

数据类型转换

目录

  一、C++强制类型转换

  二、字符串之间的转换

  三、数字类型与字符串之间的转换

  四、十六进制数据与字符串转换

 

 

一、C++强制类型转换

C++提供了四种强制类型转换:

  

强制转换类型 功能 备注
static_cast

 

 

非多态类型的转换,不能用于两个不相关类型的转换,比如不能用于整型和整型指针之间转换

1.基本类型之间的转换
2.空类型指针到其他类型指针的转换
3.子类和父类之间的换砖
4.任何类型转换乘void类型

reinterpret_cast 把一种类型转换成另一种不相关的类型,比如整型与整型指针的转换  
const_cast 删除变量的const属性,方便再次赋值 被定义为const的变量,编译器会对其优化,在寄存器中存取,默认不能改变
dynamic_cast 父类对象的指针转换成子类对象的指针或引用

1.只能用于含有虚函数的类
2.会在转换时先检查能否转换成功,不能转换会返回0,保证代码安全

 

具体使用如下:

void test_static_cast()
{
    int i = 0;
    double j = i;//C的隐式转换
    cout << j <<endl;
    double m = static_cast<double>(i);//C++的强制类型转换
    cout << m <<endl;
}
void test_reinterpret_cast()
{
    int i = 2;
    int* q = &i;
    cout << "q = " << q << endl;//输出地址
    cout << "*q = " << *q << endl;//输出2

    int* p = reinterpret_cast<int*>(i);
    cout << "p=" << p << endl;//输出0000000000000002
    cout << "*p = " << *p << endl;//输出空,因为没有对该地址进行操作
}
void test_const_cast()
{

    const int i = 10;
    int* j = const_cast<int*>(&i);
    *j=20;

    cout << "i=" << i << endl;//输出10
    cout << "*j=" << *j << endl;//输出20
}

//子类转换成父类,直接=即可,称为向上转型
//父类转换成子类,需要使用dynamic_cast进行安全转换,称为向下转型
class B:public A
{
public:
    virtual void f()
    {
        cout << "B:f()" << endl;
    }
    int b;
};
void Fun(A* p)
{
    //B* pb = (B*)p;//类A传入时,输出的pb->a是随机数
    B* pb = dynamic_cast<B*>(p);//类A传入时,转换失败
    if(pb)
    {
        cout << "convert class B" << endl;
        pb->f();

        cout << pb->a << endl;
        cout << pb->b << endl;
    }
    else
    {
        cout << "can't convert class B" << endl;
    }

}

void test_dynamic_cast()
{

    A a;
    a.a = 1;
    B b;
    b.a = 2;
    b.b = 3;

    Fun(&a);
    Fun(&b);
}
 

 

二、字符串转换

常用到的字符串有CString,std::string,char* ,const char*,TCHAR等,它们之间的转换如下:

2.1 .string/char*/const char*  ---->  CString

  使用CString::Format()实现,其它类型,int/double/float等都是用此函数转换成CString。

2.2 CString  -->>  string

//第一种方式:
CString str;
USES_CONVERSION;
std::string s(W2A(str));//仅unicode字符集下使用
//第二种方式:
CString str ;
std::string s = (CT2A)str;

2.3  CString  -->>  conat char*

//第一种方式
CString str;
const char* chstr;
char temp[MAX_PATH];
::wsprintfA(temp, "%ls",(LPCTSTR)str);//unicode字符集下不可用
cHstr = temp;     
//第二种方式
CString str;
USES_CONVERSION;
std::string s(W2A(str));//仅Unicode字符集下使用
const char* cstr = s.c_str();
//第三种方式
CString str;
char* ch = CT2A(str);

2.4 string  -->>  const char*

string str;
char* ch = str.data();
//或者
char* ch = str.c_str();

2.5 char*  -->>  string

char* ch;
string str = ch;

2.6 TCHAR--->CString

_tcscpy();

 

三、数字类型与字符串之间的转换

  数字类型   --->   字符串char*  :  itoa gcvt等等函数

  数字类型   --->   字符串string  :使用std::to_string()

  字符串char*   --->   数字类型  :atoi  atol  atof  strtod  strtol  strtoul  wcstol  wcstoul等等函数

  字符串string  -- ->   数字类型 : 使用C标准库函数:atoi strtoul等;或者使用C++标准库函数(c++11)  stoi  stol  stoul  stoll  stof  stod等

posted @ 2020-10-09 10:28  Zoya23  阅读(141)  评论(0编辑  收藏  举报