Small-K 2019-11-11 18:29 采纳率: 0%
浏览 259
已采纳

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关键字

  • 写回答

3条回答

  • bostonAlen 2019-11-12 00:01
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!