c++赋值操作符重载问题

练习定义了一下String类

String.h如下
图片说明

其中赋值操作符重载函数的声明为:String& operator = (const String& str);

函数参数为String对象的常量引用。

main.cpp如下:
图片说明

在第二行,我尝试给已经构造过的String对象赋值一个const char *类型的字符串。

在我的构想中,我没有重载过函数为const char *类型的赋值操作符,那么应该是要报错的。

但是没有,正常输出,并且赋值是成功了的

通过调试,我发现执行到赋值语句时,仍然跳到了我重载过的赋值操作符函数中去。请问这是什么道理???难不成自动将const char *类型给我转换String类型了嘛??

想不通,请各位指教


经过很长时间后,在侯捷老师的面向对象课程中,我终于深刻理解了这个问题

要理解这个问题,还要去理解一下explicit关键字的作用

出现问题的原因就在于:non-explicit-one-argument ctor(没有explicit的单实参构造函数) 会在实参需要转为对应对象时自动转换。

取消这个特性的方法就是在构造函数前加上explicit关键字

c++

3个回答

我补充下,首先,此处你的理解很好,但是表面了。str = "test",此时的"test"的确是一个const char*,
华丽的分割线*
但同时也是一个String对象,因为你的String是有const char*的构造函数的,
华丽的分割线*
你可以试试再给他加一个构造函数用std::string来进行构造,你会发现,std::string同样可以赋值,调用的还是赋值运算符。
望你采纳。

qq_35621436
Small-K 谢谢,明白了!
5 个月之前 回复
qq_35621436
Small-K 感谢
5 个月之前 回复

String 内部实现初始化就是const char*,他有自带的其他函数可以转为T,L类型的字符串

qq_35621436
Small-K 感谢
5 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问