为什么写了的重载函数没有得到执行?

I_code 2011-09-22 08:38:52
上代码:

#ifndef CHARREF
#define CHARREF
#include "myString.h"
class char_ref
{
friend class myString;
int i;
myString* s;

char_ref(myString* ss, int ii);

public:
void operator=(char c);
operator char();

};
#endif



#ifndef MYSTRING
#define MYSTRING
#include "char_ref.h"
class myString
{
friend class char_ref;
char *r;
public:
myString(char*);
char_ref operator[](int i);
};
#endif


以上是两个类的声明,函数的定义就不贴了。接着贴main函数的代码:我会在代码中标注出问题所在..

#include "char_ref.h"
#include "myString.h"
#include <iostream>
using namespace std;

int main()
{
char c1[] = {"hello world!"};
char c2[] = {"you and me!"};
myString s1(c1);
myString s2(c2);

//TODO
s1[0] =(s2[0].operator char());//此句可以跳入void operator=(char c);
s1[0] = s2[0]; //此句不会跳入void operator=(char c); 为什么s2[0]不会自动转换?

cout << s2[2] << endl;
return 0;
}


为什么s1[0] = s2[0]不跳入void operator=呢?我是定义了隐式转换的。
求教各位!
...全文
50 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2011-09-23
  • 打赏
  • 举报
回复
因为 s1[0] 和 s2[0] 的类型都是 char_ref,这时候会调用 class assignment operator。就好像你写了一个类 A,那么 A a, b; a = b; 中 = 实际上调用的是 A::operator=(A const&)。所以 s1[0] = s2[0]; 实际上是调用的 char_ref :: operator = (char_ref const&)。我知道你没有写这个函数,不过 C++ 编译器会自动为 char_ref 生成一个 assignment operator,因此 char_ref :: operator = (char_ref const&) 实际上是定义了的。虽然 s2[0] 具有到 char 的隐式类型转换操作符,不过调用 operator = (char) 需要调用 char_ref :: operator char,后者比直接调用 char_ref :: operator = (char_ref const&) 多了一层转换,因此编译器决议调用不需要多余转换的哪一个。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧