※天道酬勤※

§水至清则无鱼,人至察则无徒§
posts - 65, comments - 11, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

关于CString

Posted on 2006-08-09 18:44 五指魅力 阅读(422) 评论(0)  编辑 收藏 引用

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

只有注册用户登录后才能发表评论。