文章目录
0. 题外话
由于最近完成一个工程时候总是涉及到类型转换,然后总是出现转换后编译出错或者中文乱码情况,内心有点崩溃,所以就出了这个总结~希望以后遇到类型转换这块就比较熟练啦~
1. 前言
首先要意识到一点:CString、string、char*和char[]是不同玩意儿~
特别的是string和char*不能直接转的!
1)char*和char[]的区别
可能需要的一些小知识:
数据在内存中的存储区域
*栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
*堆:就是那些由new或malloc分配的内存块,在不适用时,要手动用delete或free来释放内存区域。
*全局/静态存储区:全局变量和静态变量被分配到同一块内存中,他们共同占用同一块内存区。
*常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
如果用字符串直接对char*赋值,那么相当于该char*类型指针指向一个常量字符串,分配的内存为常量存储区,所以不允许修改。
但如果用字符串对char[]赋值,那么其分配的内存为栈,所以可以修改。如果用char[]类型的变量赋值给char*,那么此时char*指向的内存为栈,所以可以修改。
2)char和string的区别
在C++中,string有两种,一种是字符串char[],另外一种是封装好的字符串类,要区别理解。例如’a’是char, "a"是char string,这两者都是普通的字符和字符串,和C语言中没什么不同值得注意的是后者包含两个字符,末尾有一个隐身的’\0’
而 string str = “a” 是C++ 封装好的string。C++中的char string和string不是一回事。
当用到了"string"这个关键词,就不是普通的字符串,而是用到了封装后的类。
在C++中,char仍然是一个primitive type(原始类型),而string已经经过封装,成为了一个class(类)用到它时,我们需要 #include <string>,它是C++ Standard Library (C++标准库)的一部分。
3)CString和string的区别
CString是属于MFC的类,因此一些标准C/C++库函数是不能对CString类型操作,so需要将CString类型转化为char*等其他数据类型的情况。
首先要明确,标准C中是不存在string类型的,string是标准C++扩充字符串操作的一个类。
但是我们知道标准C中有string.h这个头文件,这里要区分清楚,此string非彼string。
string.h这个头文件中定义了一些我们经常用到的操作字符串的函数,如:strcpy、strcat、strcmp等等,但是这些函数的操作对象都是char*指向的字符串。
而C++的string类操作对象是string类型字符串,该类重装了一些运算符,添加了一些字符串操作成员函数,使得操作字符串更加方便。
有的时候我们要将string串和char*串配合使用,所以也会涉及到这两个类型的转化问题。
原文:https://blog.youkuaiyun.com/bitxinhai/article/details/2292014
2. 类型转化
2.1 CString和string的相互转化
1)string 转 CString
string str = "testString";
// 方式一
CString cstr(str.c_str());
// 或CString cstr(str.data());
// 方式二
cstr = str.c_str();
// 或cstr = str.data()
// 方式三 这种输出结果会乱码 原因有待研究