您现在的位置: | 软件资讯 > 开发特区 > 开发语言 > C/C++ | |
| [ 2005-07-29 10:02:18 ] | 作者:i_like_cpp | 责任编辑:moningfeng |
<script src="http://adv.pconline/adpuba/show?id=pc.rjzx.kaifa.wenzhang.biaotixia.&media=js&pid=cs.pconline.rjzx.biaoti." type="text/javascript"></script>
·影音享乐方式!Divx6完全评测 | ·浏览下载一条龙,Opera BT 体验 | ·软件观察:别让流氓软件耍无赖! | ·关注!Longhorn 5203多图泄漏 | ·你会是那个超酷的"播客"吗? | ·我与超级兔子的恋爱史 | ·Divx Converter精彩试用 | ·图像格式转换的好帮手 | ·微软副总裁给中国大学生的信 | ·Java学习从入门到精通(附FAQ) | ·PS立体光影魔术:在玻璃上打个洞 | ·Photoshop立体魔术2:光影的奥秘 |
·影音享乐方式!Divx6完全评测 | ·浏览下载一条龙,Opera BT 体验 | ·软件观察:别让流氓软件耍无赖! | ·关注!Longhorn 5203多图泄漏 | ·你会是那个超酷的"播客"吗? | ·我与超级兔子的恋爱史 | ·Divx Converter精彩试用 | ·图像格式转换的好帮手 | ·微软副总裁给中国大学生的信 | ·Java学习从入门到精通(附FAQ) | ·PS立体光影魔术:在玻璃上打个洞 | ·Photoshop立体魔术2:光影的奥秘 |
<script type="text/javascript"> var speed=100 demo2.innerHTML=demo1.innerHTML function Marquee(){ if(demo2.offsetTop-demo.scrollTop<=0) demo.scrollTop-=demo1.offsetHeight else{ demo.scrollTop++ } } var MyMar=setInterval(Marquee,speed) demo.οnmοuseοver=function() {clearInterval(MyMar)} demo.οnmοuseοut=function() {MyMar=setInterval(Marquee,speed)}</script> |
CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大的功能所吸引.然而由于对它内部机制的不 了解,新手在将CString向C的字符数组转换时容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向 const char *转换时没有什么麻烦,如下所示: char a[100]; CString str("aaaaaa"); strncpy(a,(LPCTSTR)str,sizeof(a)); width="320" scrolling="no" height="280" frameborder="0" align="left" marginheight="0" marginwidth="0" id="ad_top" name="ad_top" src="http://adv.pconline/adpuba/show?id=pc.rjzx.kaifa.wenzhang.hzh.&media=html&pid=cs.pconline.rjzx.hzh."> 或者如下: strncpy(a,str,sizeof(a)); 以上两种用法都是正确地.因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *.很多人对LPCTSTR是什么东西迷惑不解,让我们来看看:
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.
2.C表示const
3.T是什么东西呢,我们知道TCHAR在采用UNICODE方式编译时是wchar_t,在普通时编译成char那么就可以看出LPCTSTR (PCTSTR)在UINCODE时是const wchar_t *,PCWSTR,LPCWSTR,在多字节字符模式时是const char *, PCSTR,LPCSTR.接下来我们看在非UNICODE情况下,怎样将CString转换成char *,很多初学者都为了方便采用如下方法: (char *)(LPCSTR)str 这样对吗?我们首先来看一个例子: CString str("aa"); strcpy((char *)(LPCTSTR)str,"aaaaaaaa"); cout<<(LPCTSTR)str<<endl; 在Debug下运行出现了异常,我们都知道CString类内部有自己的字符指针,指向一个已分配的字符缓冲区.如果往里面写的字符数超出了缓冲区范 围,当然会出现异常.但这个程序在Release版本下不会出现问题.原来对CString类已经进行了优化.当需要分配的内存小于64字节时,直接分配 64字节的内存,以此类推,一般CString类字符缓冲区的大小为64,128,256,512...这样是为了减少内存分配的次数,提高速度.
那有人就说我往里面写的字符数不超过它原来的字符数,不就不会出错了,比如 CString str("aaaaaaa"); strcpy((char *)(LPCTSTR)str,"aa"); cout<<(LPCTSTR)str<<endl; 这样看起来是没什么问题.我们再来看下面这个例子: CString str("aaaaaaa"); strcpy((char *)(LPCTSTR)str,"aa"); cout<<(LPCTSTR)str<<endl; cout<<str.GetLength()<<endl; 我们看到str的长度没有随之改变,继续为7而不是2.还有更严重的问题: CString str("aaaaaaa"); CString str1 = str; strcpy((char *)(LPCTSTR)str,"aa"); cout<<(LPCTSTR)str<<endl; cout<<(LPCTSTR)str1<<endl; 按说我们只改变了str,str1应该没有改变呀,可是事实时他们都变成了"aa".难道str和str1里面的字符指针指向的缓冲区是一个.我们在 Effective C++里面得知,如果你的类内部有包含指针,请为你的类写一个拷贝构造函数和赋值运算符.不要让两个对象内部的指针指向同一区域,而应该重新分配内存.难 道是微软犯了错?
原来这里还有一个"写时复制"和"引用计数"的概念.CString类的用途很广,这样有可能在系统内部产生大量的 CString临时对象.这时为了优化效率,就采用在系统软件内部广泛使用的"写时复制"概念.即当从一个CString产生另一个CString并不复 制它的字符缓冲区内容,而只是将字符缓冲区的"引用计数"加1.当需要改写字符缓冲区内的内容时,才分配内存,并复制内容.以后我会给出一个"写时复制" 和"引用计数"的例子我们回到主题上来,当我们需要将CString转换成char *时,我们应该怎么做呢?其时只是麻烦一点,如下所示: CString str("aaaaaaa"); strcpy(str.GetBuffer(10),"aa"); str.ReleaseBuffer(); 当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();还有很重要的一点就是,在能使用const char *的地方,就不要使用char *
Flash剧场全新改版,精品Flash让你看够玩够!
更多相关搜索: CString.. c.. c++.. | |
<script src="http://www.pconline/js/ad_dell.js" language="javascript" type="text/javascript"></script>
<script src="http://www.pconline/js/ad_text_pcauto.js" language="javascript" type="text/javascript"></script>
美国媒体惊叹吉利车价之低 0奇瑞A5上市 国货力拼洋品牌
<script src="http://adv.pconline/adpuba/show?id=pc.rjzx.kaifa.wenzhang.xiafang.&media=js&pid=cs.pconline.rjzx.xiafang." type="text/javascript"></script>
·6800SLI系统登场 | ·疯狂,6600_AGP标准版小测 | ·家文:升技NF8主板测试报告! | ·6600GT AGP扔入珠江? | ·看图猜哪颗CPU超频极限最强! | ·无法访问网上邻居解决方案集 |
·6800SLI系统登场 | ·疯狂,6600_AGP标准版小测 | ·家文:升技NF8主板测试报告! | ·6600GT AGP扔入珠江? | ·看图猜哪颗CPU超频极限最强! | ·无法访问网上邻居解决方案集 |
<script type="text/javascript"> var speed=100 demoo2.innerHTML=demoo1.innerHTML function Marquee(){ if(demoo2.offsetTop-demoo.scrollTop<=0) demoo.scrollTop-=demoo1.offsetHeight else{ demoo.scrollTop++ } } var MyMar=setInterval(Marquee,speed) demoo.οnmοuseοver=function() {clearInterval(MyMar)} demoo.οnmοuseοut=function() {MyMar=setInterval(Marquee,speed)}</script> |
| 发给好友 | 我要报错 | 投稿给我们 | 加入收藏 | 返回顶部 | | |
发表评论