如:
CString test="a";
if(test==NULL)AfxMessageBox("ee");
为什么CString 类不能与NULL,false,0相比较呢?编译通过,但是执行出现错误!
请教下高手深入讲解下!
类似:char aa='a';
if(aa==NULL)AfxMessageBox("ee");
却能良好的运行!!
CString test="a";
if(test==NULL)AfxMessageBox("ee");
为什么CString 类不能与NULL,false,0相比较呢?编译通过,但是执行出现错误!
请教下高手深入讲解下!
类似:char aa='a';
if(aa==NULL)AfxMessageBox("ee");
却能良好的运行!!
m_str.IsEmpty()
CString test="a";
if(test==" ")AfxMessageBox("ee");
test 是一个类的对象,是一个结构 ……char aa='a';
aa 是一个变量,里面存放的是一个数值 ……NULL是一个宏,#define NULL ((void *)0),也是一个数值 ……所以,aa可以与NULL比,test不可以 ……
CString test="a"; 其实已经对test这个CString类型的对象进行了初始化, 那么它就已经分配到了一个十六进制的内存地址,也就是一个不为0的地址.其实LZ可以看一下NULL宏的定义
#define NULL 0
其实它从某种程度上与0是等效的LZ的意思应该是想要检测其是否为空吧?那只要
if(test=="")
AfxMessageBox("ee");那为什么char aa='a';
if(aa==NULL)AfxMessageBox("ee");
可行呢?其实char型变量实际上对应的也是一个数值,比如a对应于97,A对应于65,从上面可以知道NULL有个#define NULL 0的定义,都是数值型的比较不会有错吧?
但
CString test="a";
if(test==NULL)AfxMessageBox("ee");
中的test显然是一个对象(一个类的实例化后生成的一个实体)
比方说, struct从某个程度上也可以有类的功能,如果你把这个test换成结构体后, 看下会不会是同样的结果呢?
==的一边是一个结构,一边是一个数值,执行能不出错吗? 说多了可能把你搞乱了,不好意思... 其实你这样子试试
CString test="a";
if(&test==NULL)AfxMessageBox("ee");是不是不会出错? 呵呵, 多了个& . 希望能帮助你理解
关于这个,编译时可以通过,那是因为CString类定义了BOOL operator ==( const CString& s1, LPCTSTR s2 );这个重载函数,而NULL定义为(void *)0,再加上VC6对C++标准的支持不高,可能将void *转换成了LPCTSTR了吧(都是指针类型),所以编译通过,但运行时,由于void *毕竟不是LPCTSTR,在比较的时候肯定要出错的。楼主可以用VS2008编译下,肯定通不过的。
想要通过,也就是楼主想要CString和NULL比较的话,那就得自己写BOOL operator ==( const CString& s1, void * s2);这样一个函数,可实现如下:
BOOL operator ==( const CString& s1, void * s2)
{
if(s1.IsEmpty())
return TRUE;
else
return FALSE;
}
我们可以看到,其实第2个参数没用到,那就说明test==NULL这样的比较式无意义的,应该这样比
test==""
建议楼主补补C+++的基础知识,会写出这样的代码,表示楼主的C++的基本功还不够。
要知道,任何一个类,所有的操作符(除.和->),像+,-,==,!=这些,都是不能直接使用的,因为你自定义的类,不是系统默认的类型,你要比较CString和NULL,我们知道,是要比较字符串是否为空,但系统怎么知道怎么比,是比长度,比大小,还是比什么?所以如果要比的话,就必须自己去写比较函数,告诉系统怎么去比较。
char* a="a";
strcmp(a,NULL);
测试一下(C语言,C++用API lstrcmp)
想比大小、长度?sizeof a==0
想比内容?把0换成"0"再比所以说,你和0比怎么看都不是一个好的程序。
CString test="a";
if(test==NULL)AfxMessageBox("ee");
改成
如:
CString test="a";
if(test.lockbuffer()==NULL)AfxMessageBox("ee");
if(test==_T(""))AfxMessageBox("ee"); 运行正确的很!呵呵