练习定义了一下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关键字
我补充下,首先,此处你的理解很好,但是表面了。str = "test",此时的"test"的确是一个const char*,
华丽的分割线*
但同时也是一个String对象,因为你的String是有const char*的构造函数的,
华丽的分割线*
你可以试试再给他加一个构造函数用std::string来进行构造,你会发现,std::string同样可以赋值,调用的还是赋值运算符。
望你采纳。
https://www.cnblogs.com/ben-future/p/10623434.html
String 内部实现初始化就是const char*,他有自带的其他函数可以转为T,L类型的字符串