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条)

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧