读书人

满载重载

发布时间: 2013-07-04 11:45:51 作者: rapoo

重载重载


char a[]={"aaaa"};

CString cs("cscs");
if(cs==a)//OK
return;
String ss("ssss");
if(ss==a)//error
return;
照猫画虎CString接口就无歧义
friend bool operator==(
_In_ const CStringT& str1,
_In_z_ PCXSTR psz2) throw()
{
return( str1.Compare( psz2 ) == 0 );
}

我的String就有歧义
friend bool operator==(const String& s1,const String& s2);
friend bool operator==(const String& s1,const char* s2);//类似接口
friend bool operator==(const char* s1,const String &s2);

求教了
[解决办法]
不懂,猜一下吧,会不会是因为const char* s2可以进行string的构造
[解决办法]
运算符重载是语法糖。

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

[解决办法]
是不是哪里引起二义性问题了?

[解决办法]
operator const char*() const;已经够用了,
为何要operator char*() const;
[解决办法]
friend bool operator==(const String& s1,const String& s2);
friend bool operator==(const String& s1,const char* s2);
if(ss==a)//error
无法决定调用的是上面的哪个函数
a既可以转换为const char,又可以转换为String(String(a)),存在二义性
[解决办法]
把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。

读书人网 >C++

热点推荐