关于运算符重载,该怎么处理
关于运算符重载struct S { S(int) { } /* … */ } struct SS {int mSS(int x) :m(x) { }// 因为结构体S中
关于运算符重载
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,必须显式调用,不允许编译器帮助隐式转换。
[解决办法]其实LS的意思是
S s1 = ss; // 正确;类似隐式构造函数
这个相当于
S s1 = (S)ss;
operator S()重载的是SS对S类型的转换
这样LZ应该明白了吧