CString是属于MFC的类,实际上程序中,好多地方都要用到标准c++里面char*,或者LPCTSTR。比如cout<<就不能跟CString类对象,而要将其转化成LPCTSTR。这里,前几个问题都说的有关标准c++的char*,后面说CString的使用中一些有必要注意的地方。
1 字符数组名,字符串常量,和字符指针都属于同一种类型.
char buffer[10]; char* pc; "hello"; 可以互相赋值.
2 const char* p; 常量指针,指向常量的指针.
char* const p; 该指针是常量,不允许更改.
2 e.g.
if ("join"=="join")
cout<<"equal \n";
else
cout<<"not equal \n";
结果是 not equal.因为程序中两个字符串的比较实际上是两个字符串地址的比较.编译时候给了这两个字符串不同的地址,所以地址不同.
如果要比较字符串的字面意义,可以用strcmp().
3 e.g.
#include<iostream.h>
void main()
{
char buffer[10]="ABC";
char *pc;
pc="hello";
cout<<pc<<endl;
pc++;
cout<<pc<<endl;
cout<<*pc<<endl;
pc=buffer;
cout<<pc;
}
result:
hello
ello
e
ABC
说明:结果容易理解,要说明的是,当pc指向buffer以后,字符串常量"hello"仍逗留在内存的data区,但是再也访问不到该字符串了.数据丢失.
所以,对于字符串常量赋值给字符指针的情形,一般指针不再重新赋值. (也就是说应该用指针常量char* const p)
3' CString的工作原理。下面内容应该是正确的,原来看到有地方说CString赋值就是赋指针,对原来的CString对象修改内容时候,就会影响到被赋值得CString对象。好像CString对象要赋值就不能更改内容一样。实际看了一下,应该是以下面的为准。
当使用一个CString对象a来初始化另一个CString对象b时,为了节省空间,新对象b并不分配空间,它所要做的只是将自己的指针指向对象a的那块内存空间,只有当需要修改对象a或者b中的字符串时,才会为新对象b申请内存空间,这叫做写入复制技术(CopyBeforeWrite)。引用自:http://www.123xz.net/article/article_8181_1.html
notes: 文章中,通过GetData()取得CStringData的对象指针。
看了几篇文章,感觉上面的一篇说的相对更明白清楚。
4 LPCTSTR 和 LPTSTR的区别和const char* p; char * const p;的对应关系.
long pointer const Tchar string , const TCHAR* : LPCTSTR
TCHAR*: LPTSTR
为什么要用LPCTSTR和 LPTSTR代替char*,是因为要用到TCHAR。
5 遇到的问题:
const char sz[] = (LPCTSTR)(pMetrics->strKey);
const char *sz= (LPCTSTR)(pMetrics->strKey);
为什么编译时候,后者能通过,而前者报错: error C2440: can't convert from 'ATL::CSimpleStringT<BaseType,t_bMFCDLL>::PCXSTR'
什么是ATL阿? 为什么会出现这个错误呢?
6 (LPCTSTR)和getbuffer()的区别: 看一下关于CString总结.
http://www.zahui.com/html/1/1753.htm
http://blog.csdn.net/pinping1314/archive/2005/04/21/357260.aspx
7 把CString转化成c类型的null结尾的字符串:
(1). 最简单的,用(LPCTSTR)强制类型转换把CString转换成LPCTSTR,(LPCTSTR)强制类型转换操作符返回一个指针,指向从一个CString得到的只读的null结尾的c类型字符串.这个指针实际上指向CString的数据区.如果该CString对象超过边界或者被自动删除,或者被某些操作改变了内容,这个LPCTSTR指针将不再有效.应该把这个指针指向的string当作暂时的.
CString只允许一种强制类型转换,即强制转换为LPCTSTR。强制转换为LPTSTR (非常量指针)是错误的(即(LPTSTR)(LPCTSTR)str)。按照老习惯,将CString强制转换为LPTSTR只能伤害自己。有时在程序中没有发现出错,那只是碰巧。转换到非常量指针的正确方法是调用GetBuffer()方法。
(3). 可以用CString本身的函数,比如SetAt,来修改string对象的单个字符. 如果想把CString对象的内容拷贝出来修改,可以用strcpy(Unicode/MBCS-portable _tcscpy),来把CSting对象拷贝到一个单独的buffer里面,安全修改这些字符串.比如:
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
//... modify lpsz as much as you want