读书人

关于运算符重载,该怎么处理

发布时间: 2014-06-08 16:37:54 作者: rapoo

关于运算符重载

struct S { S(int) { } /* … */ };

struct SS {
int m;
SS(int x) :m(x) { }
// 因为结构体S中没有S(SS);不存在干扰
operator S() { return S(m); }
};

SS ss(1);
S s1 = ss; // 正确;类似隐式构造函数
S s2(ss); // 正确;类似隐式构造函数
void f(S);
f(ss); // 正确;类似隐式构造函数


struct S { S(int) { } };

struct SS {
int m;
SS(int x) :m(x) { }

// 因为结构体S中没有S(SS)(译注:因为结构体S中没有定义S(SS),
// 无法将SS转换为S,所以只好在SS中定义一个返回S的转换操作符,
// 将自己转换为S。转换动作,可以由目标类型S提供,也可以由源类型SS提供。)
explicit operator S() { return S(m); }
};

SS ss(1);
S s1 = ss; // 错误;类似显式构造函数
S s2(ss); // 正确;类似显式构造函数
void f(S);
f(ss); // 错误;类似显式构造函数
}


上面那个operator S()没看懂是什么意思?怎么用啊这个?

s1=ss这个不是应该用S的赋值构造函数?S里没有啊。。。

s2(ss)这个不是应该用S的复制构造函数?S里也没有啊。。。

为什么第一个例子里f(ss)是对的啊。。。

谢谢
[解决办法]
operator S() 这个是重载操作符(),返回的值类型为S

S s1 = ss; // 正确;类似隐式构造函数
这个相当于S s1 = ss.operator(); 只不过被编译器隐式这样转换了。程序员自身没有这样写

第二处为啥不行了呢,因为加了explicit,必须显式调用,不允许编译器帮助隐式转换。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

operator S() 这个是重载操作符(),返回的值类型为S

S s1 = ss; // 正确;类似隐式构造函数
这个相当于S s1 = ss.operator(); 只不过被编译器隐式这样转换了。程序员自身没有这样写

第二处为啥不行了呢,因为加了explicit,必须显式调用,不允许编译器帮助隐式转换。

返回值不都是在operator前面吗?不是应该这样:S operator()?

()这个运算符需要放在()前面,如果放到operator之前,编译这为S operator()是一个类定义。定义了一个operator的类.


其实LS的意思是
S s1 = ss; // 正确;类似隐式构造函数
这个相当于

S s1 = (S)ss;

operator S()重载的是SS对S类型的转换
这样LZ应该明白了吧

读书人网 >C++

热点推荐